vptr指针会提前布局,可以通过sizeof()求类的大小
class Parent1 { public: Parent1(int a = 1) { this->a = a; print(); } virtual void print() { cout << "Parent1:" << a << endl; } private: int a; }; class Parent2:public Parent1 { public: Parent2(int a = 1,int b = 2):Parent1(a) { this->b = b; print(); } virtual void print() { cout << "Parent2:" << b << endl; } private: int b; }; int main() { Parent2 p; printf("sizeof(Parent1):%d,sizeof(Parent2):%d\n", sizeof(Parent1), sizeof(Parent2)); system("pause"); return 0; }执行结果:
当把父类和子类中的virtual关键字去掉:
上面的输出结果很好理解,因为父类中有一个int类型变量占4个字节大小,而子类继承了父类之后,子类的空间大小是要算上父类的原本大小,从而占8字节大小。
父类和子类中定义为虚方法(virtual):
子类和父类同时都增加了4个字节,也就是说在初始化类的对象时编译器帮我们增加一个指向虚函数表的vptr指针。