您的位置:首页 > 编程语言 > C语言/C++

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后, 继承关系是这样的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: