C++常见面试题 虚函数

2025-05-06 13:44:11

1、在没有虚函数的情况下,一个简单的类所占的内存大小是成员函数所占的内存大小,类中含有一个int型成员,所占内存大小为4.

C++常见面试题 虚函数

2、在此类中添加了一个虚函数,类的内存变成了8,多个了虚函数指针(vfptr);也就是说当类中存在虚函数时,内存中保存的是一个虚函数指针(指针所占用的内存大小为4),这个虚函数指针执向了一个虚函数表(vftable),而这个虚函数表中存放的是类中虚函数的地址。

C++常见面试题 虚函数

3、在出现继承的情况下,如图SubBaseA继承了BaseA,虚指针也被继承了,所以在SubBaseA中依然存在一个虚指针指向一个虚函数表,在虚函数表中存放的先是来自父类的虚函数地址,而后是派生类中同名的虚函数覆盖了父类的虚函数地址,派生类虚函数地址。

C++常见面试题 虚函数
C++常见面试题 虚函数

4、pBase 在构造函数被调用时指向了SubBaseA的虚函数表,即pBase->vfptr->SubBaseA::BTest(),这就是所谓的多态的完成原理。类中的虚函数是动态生成的,由虚函数表的指向进行访问。普通函数的地址对编译期来说“静态”的,也就是函数地址在编译期就已经确定了

C++常见面试题 虚函数

5、再引入一个类,让SubBaseA多重继承,上面说了如果父类含有虚指针,则派生类继承时会把虚指镅氪瓷杵针继承下来;多重继承时观锻娜叼候,派生类中内存的分布会根据继承声明的顺序确定,派生类如果重写了父类的方法,则此方法的地址会紧随在父类的地址后面,如果是派生类自己的虚函数,则地址在内存中会放在第一个继承的类的地址后面。

C++常见面试题 虚函数
C++常见面试题 虚函数

6、通过以上的描述基本可以理解了C++虚函数的虚拟机制原理,还有一个常见的面试问题是继承中为什么把析构函数设置为虚函数,之前只是知道但是不清楚,搞懂了虚函数的原理之后就彻底理解了继承中一定要把析构设置为虚函数,不然就会出现内存泄漏了。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢