#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后, 继承关系是这样的.