C++面经:C++多态-----虚函数、虚函数表、虚函数指针、虚继承

1.虚函数引入类中之后,类会发生什么变化?

首先我们创建一个空类A,然后创建一个类的对象a,并打印它的占用空间大小 ---为1

 

 

 

我们再往类中添加两个成员函数后,再返回对象a的占用空间大小发现还是1

说明类A 的普通成员函数不占用类对象的内存空间

 

 

如果我们在类中添加一个虚函数后,对象的占用空间大小就变成 4

说明在添加虚函数之后,编译器会向类中插入一个看不见的成员变量(虚函数表指针vptr)virtual table pointer ---4字节 而它占用类对象a的内存空间

 

 

 

2.虚函数表的生成时机和生成原因:

当类A中至少存在一个虚函数时,在编译期间,编译器就会为类A生成一个虚函数表virtual table(vtbl)

 

 

 

 

 

 

 

 

 虚函数表会一直伴随类A一直到内存中

 

3.虚函数表指针被赋值的时机

 

虚函数表指针与虚函数表的关系:

 

 

 

 

对于含有虚函数的类A ,编译器会在编译过程中在构造函数中穿插为虚函数表指针赋值的语句

 

使得虚函数表指针指向虚函数表

 

 

 

4.类对象在内存中的布局:

完整的类A对象代码:

 

 

 

 连接方式与布局:

虚函数指针指向虚函数表,虚函数表包含所有虚函数的指针

 

 

 

5.虚函数的工作原理,多态性的体现:

多态的体现:

父类子类拥有同名虚函数的情况下

父类指针new一个*子类对象或者通过父类引用来绑定一个&子类对象时

父类中,使父类指针或者引用去调用虚函数

那么实际调用的是子类的虚函数

 

 

 两个方面理解多态:

原则:

 

 

 

代码实现上:

如果是 vptr -> vtbl -> 虚函数 这个路线 那么就体现了多态性  (用对应的汇编代码查看调用情况)

直接像普通成员函数调用就不是多态

 

 

 

表现形式上:

原则:

 

 

示例:

 

 

布局:(存在override覆盖现象)

 

posted @ 2022-11-09 22:18  slowlydance2me  阅读(23)  评论(0编辑  收藏  举报