菱形继承二义性解决方法--虚拟继承
2014-08-14 21:36
381 查看
//虚拟继承是为了解决多重继承而出现的,比如 /* A / \ B C \ / D 如果直接 class A{}; class B : public A{} class C : public A{} class D : public B, public C{} 那么在创建D的对象时候,将会生成2个A对象,1个B对象,1个C对象 如果采用虚拟继承 class A{}; class B : public virtual A{} class C : public virtual A{} class D : public B, public C{} 那么在创建D的对象时候,将会生成2个A对象,1个B对象,1个C对象 测试代码如下 */ #include <iostream> using namespace std; class A { public: A(){cout << "A constructor"<<endl;} int a; }; class B : public A { public: B(){cout << "B constructor"<<endl;} }; class C : public A { public: C(){cout << "C constructor"<<endl;} }; class D : public B,public C { public: D(){cout << "D constructor"<<endl;} }; class B1 : public virtual A { public: B1(){cout << "B1 constructor"<<endl;} }; class C1 : public virtual A { public: C1(){cout << "C1 constructor"<<endl;} }; class D1 : public B1,public C1 { public: D1(){cout << "D1 constructor"<<endl;} }; int main() { /* 输出 A B A C D 这样的话就又两个A,就会出现2义性,比如 D d; d.B::a = 2; d.C::a = 3; 是两个不同的a */ D d; size_t d_size = sizeof d; //1 D1 d1; size_t d1_size = sizeof d1; //8,两个vpointer指向B和C的vtable /* 输出 A B1 C1 D1 */ return 1; }
普通继承内存分布
使用虚拟继承的内存分布
相关文章推荐
- 剖析C++是如何解决菱形继承的二义性和数据冗余的
- c/c++ 多重继承下的二义性解决方法
- C++菱形继承及解决方法
- 多重继承的二义性以及解决方法
- 1:分析菱形继承的问题。 2:剖析虚继承是怎么解决二义性和数据冗余的。
- 通过菱形继承剖析虚继承解决二义性和数据冗余问题
- 多重继承引发的二义性问题及解决方法分析
- 菱形继承问题和虚继承是如何解决二义性与数据冗余的
- 菱形继承问题分析及其在C++的解决方法(虚继承)
- C++学习一菱形继承多文件解决方法
- 多重继承的二义性以及解决方法
- vs2008 mvc2的项目迁移到vs2010 mvc2过程中提示“inex.aspx必须继承自ViewPage”错误的解决方法
- C++多重继承,virtual虚拟继承解决多重继承中的二义性
- C#接口多继承中方法重名解决办法
- 解决派生类多重继承产生的二义性
- 【转】C++中多重继承的二义性及解决办法
- 解决重写父类的方法且不会影响继承的子类的问题
- 菱形继承产生的问题及解决
- android listview继承BaseAdapter,自定义的适配器,getView方法执行多组循环解决方式
- struts2無法继承json-default的解决方法