123456789101112131415161718
class A {public: A(int _a1,int _a2) : a1(_a1),a2(_a2); void foo1();private: int a1; int a2;};class B : public A {public: B(int _b1,int _b2) : b1(_b1),b2(_b2){} void foo2();private: int b1; int b2;}
如果一个类没有虚函数,那么它的对象的布局跟C语言的struct一样,对象内存布局中只有成员变量.如果类B继承A,因为B的构造函数是先构造父类再构造子类,所以内存模型中是在A的成员变量后加上B的成员变量.
示意图:
123456789101112131415161718192021
class A {public: A(int _a1,int _a2) : a1(_a1),a2(_a2); virtual void foo1(); virtual void foo2(); virtual void foo3();private: int a1; int a2;}class B : public A {public: B(int _b1,int _b2) : b1(_b1),b2(_b2){} virtual void foo4(); virtual void foo2(); virtual void foo5();private: int b1; int b2;}
当父类存在虚函数时,子类继承父类的虚函数表,虚函数表的顺序先是父类的虚函数,再是子类的虚函数.父类的虚函数被子类重写时,虚函数表中的父类被替换为子类的虚函数指针.
多重继承,多继承,菱形继承等待更..