c++菱形继承产生的问题及解决
2016-10-18 22:24
399 查看
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
class A {
public:
A(){printf("A create.\n");}
int a;
virtual void fun(){}
};
class B: public A{
public:
B(){printf("B create.\n");}
int b;
virtual void fun1(){}
};
class C: public A
{
public :
int c;
C(){printf("C create.\n");}
virtual void fun3(){printf("fun3 .\n");}
};
class D:public C,public B{
public:
int d;
D(){printf("D create.\n");}
virtual void fun3(){printf("fun4 .\n");}
};
//二义性问题的开销
int main() {
D *pd=new D;
printf("%d\n",sizeof(D));
getchar();
}
两个子类继承同一个父类,而又有子类又分别继承这两个子类,会产生二义性问题,此时的继承关系是这样的:
A A
| |
B C
\ /
D
相当于baseClass A在类中有两个,这可能不是我们想要的结果,增加调用的困难,同时也会浪费内存资源。
那怎么解决这种问题呢?使用虚拟继承!
#include<iostream>
using namespace std;
class A{
public:
A(char *s)
{
cout<<s<<endl;
}
~A(){}
};
class B:virtual public A
{
public:
B(char *s1,char*s2):A(s1){
cout<<s2<<endl;
}
};
class C:virtual public A
{
public:
C(char *s1,char*s2):A(s1){
cout<<s2<<endl;
}
};
class D:public B,public C
{
public:
D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s1,s3),A(s1)
{
cout<<s4<<endl;
}
};
int main() {
D *p=new D("class A","class B","class C","class D");
delete p;
return 0;
}此时,baseClass A是公用的,也就是baseClass A就实例化了一个对象!
A
/ \
B C
\ /
D
加了virtual后, 继承关系是这样的.
#include<iostream>
#include<queue>
using namespace std;
class A {
public:
A(){printf("A create.\n");}
int a;
virtual void fun(){}
};
class B: public A{
public:
B(){printf("B create.\n");}
int b;
virtual void fun1(){}
};
class C: public A
{
public :
int c;
C(){printf("C create.\n");}
virtual void fun3(){printf("fun3 .\n");}
};
class D:public C,public B{
public:
int d;
D(){printf("D create.\n");}
virtual void fun3(){printf("fun4 .\n");}
};
//二义性问题的开销
int main() {
D *pd=new D;
printf("%d\n",sizeof(D));
getchar();
}
两个子类继承同一个父类,而又有子类又分别继承这两个子类,会产生二义性问题,此时的继承关系是这样的:
A A
| |
B C
\ /
D
相当于baseClass A在类中有两个,这可能不是我们想要的结果,增加调用的困难,同时也会浪费内存资源。
那怎么解决这种问题呢?使用虚拟继承!
#include<iostream>
using namespace std;
class A{
public:
A(char *s)
{
cout<<s<<endl;
}
~A(){}
};
class B:virtual public A
{
public:
B(char *s1,char*s2):A(s1){
cout<<s2<<endl;
}
};
class C:virtual public A
{
public:
C(char *s1,char*s2):A(s1){
cout<<s2<<endl;
}
};
class D:public B,public C
{
public:
D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s1,s3),A(s1)
{
cout<<s4<<endl;
}
};
int main() {
D *p=new D("class A","class B","class C","class D");
delete p;
return 0;
}此时,baseClass A是公用的,也就是baseClass A就实例化了一个对象!
A
/ \
B C
\ /
D
加了virtual后, 继承关系是这样的.
相关文章推荐
- 菱形继承产生的问题及解决
- 菱形继承问题分析及其在C++的解决方法(虚继承)
- 多继承实现COM类中的"菱形问题" C++也有一样的菱形问题
- C++ 菱形继承问题 虚继承和虚基类
- 【编程语言】如何解决菱形继承问题
- C++多重继承引发的重复调用问题与解决方法
- C++学习一菱形继承多文件解决方法
- 剖析C++是如何解决菱形继承的二义性和数据冗余的
- 菱形继承问题和虚继承是如何解决二义性与数据冗余的
- 1:分析菱形继承的问题。 2:剖析虚继承是怎么解决二义性和数据冗余的。
- c++之菱形继承问题
- 关于C++中菱形继承和虚继承的问题总结
- 通过菱形继承剖析虚继承解决二义性和数据冗余问题
- 多重继承之虚继承(主要是为了解决产生的数据冗余问题)
- java/c++钻石问题(菱形继承问题) 虚继承
- C++菱形继承及解决方法
- C++之钻石问题和解决方案(菱形继承问题)
- C++之菱形继承的解决之道
- 同一段C++代码在win下和linux下同时编译时产生的头文件包含问题及解决
- C++之钻石问题和解决方案(菱形继承问题)