菱形继承问题
来源:互联网 发布:js json 取值 编辑:程序博客网 时间:2024/03/29 00:07
文章前半部分引用:http://blog.csdn.net/icerlion/article/details/4409618
考虑这种情况:
class CA{};
class CB : public CA{};
class CC : public CA{};
这时我们需要一个CD类,它需要同时继承CB和CC。
问题就出现了。
如果我们这样写:
class CD : public CB, public CC{};
那么我们在构造一个CD类的时候,
其结果如下:
即:一个CD类中有两个CA(它的超类的对象)
这样的情况是不合理的。此时会出现模糊调用的现象。
如何避免这种现象呢?
虚继承就有了用武之地。
我们需要改写CB和CC的继承方式。
class CB : public virtuel CA{};
class CC : public virtual CA{};
其他无需修改。此时我们构造一个CD类的时候,
其顺序如下:
开始构造CD类,
先构造一个超类CA,然后构造CB,
在构造CC(此时不会构造CC的父类CA)
这样一来,
CD类对象中包含的CB和CC将共享同一份CA对象。
这时就不会出现模糊调用的现象了。
这个就是C++臭名昭著的多继承。
在JAVA中根本不会出现这种情况,
如果必须使用菱形继承的时候务必使用虚拟继承。
如果你的项目中有太多的菱形继承,
你或许应该重新考核一下你的软件工程师。
--------------------------------------------------------------------------
例子:
fun.h
#ifndef FUN_H#define FUN_Hclass A{public: int a; A() { a=10; }};class B1:public A //没有使用虚继承{public: int b1; B1() { b1=1; a=11; }};class B2:public A //没有使用虚继承{public: int b2; B2() { b2=2; a=12; }};class C:public B1,public B2{public: int c; C() { c=3; }};#endif
// main.cpp
#include "fun.h"#include <iostream>using namespace std;int main(){ C *pc=new C(); cout<<pc->a<<endl; return 0;}
main.cpp: In function ‘int main()’:main.cpp:25: error: request for member ‘a’ is ambiguousfun.h:24: error: candidates are: int A::afun.h:24: error: int A::amake: *** [all] 错误 1
class B1:virtual public Aclass B2:virtual public A
root@debian6:/home/michael/cppProject/angleInheritance# makeg++ -c main.cppg++ -o t main.orm *.oroot@debian6:/home/michael/cppProject/angleInheritance# ./t12结果12的原因是C类构造函数C()会先调用虚基类A的构造函数A(),然后再调用自身父类构造函数B1(),B2(),调用顺序是根据“class C:public B1,public B2”从左向右依次进行。
若将C的继承顺序改为 “class C:public B2,public B1”后,结果则为11
root@debian6:/home/michael/cppProject/angleInheritance# makeg++ -c main.cppg++ -o t main.orm *.oroot@debian6:/home/michael/cppProject/angleInheritance# ./t11
- 菱形继承问题
- 菱形继承问题
- 菱形继承问题(default)
- 菱形继承->菱形虚拟继承(继承系列问题)
- 菱形继承与菱形虚拟继承的相关问题
- virtual解决菱形继承中多份拷贝问题
- 【编程语言】如何解决菱形继承问题
- volatile的作用和菱形继承问题
- 什么是菱形继承带来的二义性问题
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- 菱形继承
- android的Menu的使用
- FAQ1:pDlg
- MyEclipse快捷键
- VLC 源代码结构
- vc format举例
- 菱形继承问题
- android小记之自定义ImageView
- 初识AJAX
- 对不起,您没有访问权限
- 【软件差错警示钟】一起软件差错造成的多名病人死亡事故
- hdu 4160 dolls 最少路径覆盖
- jquery使用$与其它js框架的冲突解决办法
- 今后的工作重点
- 年轻人,你知道多少,做了多少!