测试环境:VS2013
C++中的类对象模型有简单的,也有复杂的。今天尝试着剖析一下,以加深对继承,虚函数等的理解。
从最简单的继承开始
class Base { public: int b; }; class Derive : public Base { public: int d; }; int main() { cout << sizeof(Derive) << endl; Derive d1; d1.b = 0x01; d1.d = 0x02; return 0; }
定义一个基类Base类,将其成员变量设为公有,为了方便修改。定义一个派生类Derive类,继承自Base类。在main中输出派生类的大小,创建一个Derive类对象,对它的成员数据分别赋值以方便在内存中进行区分。运行程序输出8 个字节,我们可以依据这个数值通过&d1将内存中的d1截取出来:
可以看出d1的对象模型:
这个就作为练手。剩下的说的就不那么详细了。
继承+虚函数
输出12:class Base { public: virtual void fun1(){} virtual void fun2(){} public: int b; }; class Derive : public Base { public: virtual void fun1(){} virtual void fun2(){} virtual void fun3(){} public: int d; }; int main() { cout << sizeof(Derive) << endl; Derive d1; d1.b = 0x01; d1.d = 0x02; return 0; }
虚函数+多重继承
class Base { public: virtual void fun1() { cout << "Base::fun1()" << endl; } virtual void fun2() { cout << "Base::fun2()" << endl; } public: int b; }; class C : public Base { public: virtual void fun1() { cout << "C::fun1()" << endl; } public: int c; }; class Derive : public C { public: virtual void fun2() { cout << "Derive::fun2()" << endl; } virtual void fun3() { cout << "Derive::fun3()" << endl; } public: int d; }; int main() { cout << sizeof(Derive) << endl; Derive d1; d1.b = 0x01; d1.c = 0x0c; d1.d = 0x02; d1.fun1(); d1.fun2(); d1.fun3(); return 0; }
输出16:
菱形继承+虚函数
class Base { public: virtual void fun0() { cout << "Base::fun0()" << endl; } virtual void fun1() { cout << "Base::fun1()" << endl; } virtual void fun2() { cout << "Base::fun2()" << endl; } public: int b; }; class C1 : public Base { public: virtual void fun1() { cout << "C1::fun1()" << endl; } public: int c; }; class C2 : public Base { public: virtual void fun1() { cout << "C2::fun1()" << endl; } public: int c; }; class Derive : public C1, public C2 { public: virtual void fun2() { cout << "Derive::fun2()" << endl; } virtual void fun3() { cout << "Derive::fun3()" << endl; } public: int d; }; int main() { cout << sizeof(Derive) << endl; Derive d1; d1.C1::b = 0x01; d1.C1::c = 0x1c; d1.C2::b = 0x01; d1.C2::c = 0x2c; d1.d = 0x02; d1.C1::fun0(); d1.C1::fun1(); d1.C1::fun2(); d1.C2::fun0(); d1.C2::fun1(); d1.C2::fun2(); d1.fun3(); return 0; }
![]()
C++虚函数对象模型剖析
最新推荐文章于 2023-08-22 14:59:05 发布