目录
#include <iostream>
class Base
{
public:
int bi_;
int bk_;
};
class A : public Base
{
public:
int i_;
};
int main()
{
A aobj;
aobj.bi_ = 1;
aobj.bk_ = 2;
aobj.i_ = 3;
return 0;
}
1、父类和子类都没有虚函数
运行上述代码,查看内存地址:
内存布局图如下:
2、父类有虚函数、子类没有虚函数
在 Base 类中加入虚函数,查看内存地址如下:
红框部分即为虚函数表指针 vptr,内存布局图如下:
3、父类没有虚函数,子类有虚函数
在 A 类中加入虚函数,查看内存地址如下:
红框部分即为虚函数表指针 vptr,内存布局图如下:
4、父类和子类都有虚函数
在 Base 类和 A 类中均加入虚函数,查看内存地址如下:
红框部分即为虚函数表指针 vptr,内存布局图如下:
拓展:子类的虚函数表中共有两项,依次如下:
(1)父类的虚函数的首地址。
(2)子类虚函数的首地址。
5、总结
对于单一继承的类,无论父类还是子类谁有虚函数,子类对象的虚函数表指针均位于该对象模型的首地址的位置。
(SAW:Game Over!)