C++虚函数对象模型剖析

来源:互联网 发布:淘宝如何增加粉丝 编辑:程序博客网 时间:2024/06/05 00:09

测试环境: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的对象模型:

                

这个就作为练手。剩下的说的就不那么详细了。

继承+虚函数

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;}
输出12:

                  

虚函数+多重继承

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;}

1 0
原创粉丝点击