现在的位置: 首页 > 综合 > 正文

多重继承

2013年10月14日 ⁄ 综合 ⁄ 共 868字 ⁄ 字号 评论关闭

1、相同基类继承的二义性

     多个子类同时继承与同一个基类后,其派生类在访问基类成员时,会出现二义性问题,因为派生类无法选择继承路径。解决办法,通过使用虚拟继承可以解决这类二义性问题。

#include <stdio.h>  
#include <stdlib.h>
#include <iostream>
using namespace std;

class A
{
public: 
    int a;
};
 
class B:public virtual A  //A是B的虚基类
{
public: 
    int b;	
};

class C:public virtual A  //A是C的虚基类
{	
public:	
    int c;	
};

class D:public B,public C
{	
public:	
    int d;	
};

int main()
{	
    D d;	
    d.a = 100;   //通过虚基类继承,不会出现两义性问题
	
    return 0;	
}

2、不同基类继承的二义性

   子类继承多个父类,并且这个多个父类具有相同命名的成员(只要名称相同,不区分函数参数或者成员类型);当子类调用父类相同命名成员时,会出现二义性问题,因为派生类不能区分调用哪个父类的成员。解决办法,通过使用指定父类名称可以解决这类二义性问题。

#include <stdio.h>  
#include <stdlib.h>
#include <iostream>
using namespace std;

class A{
public:
	int a;
	void dispaly(){};
};
class B{
public:
	int b;
	void dispaly(){};
};

class C:public A,public B
{
public:
	int  b;
	void show(){};
};

int main()
{	
	C c;
	c.b;            //不会出现两义性,调用是C中的b
	c.B::b;         //调用B中的b

//	c.dispaly();    //两义性问题出现
	c.A::dispaly(); //通过指定基类A来调用函数display
	c.B::dispaly();
    return 0;	
}

 3、画图形象说明基类A , B、C继承于A ,D继承于B、C

两义性问题的产生:

虚基类消除两义性

抱歉!评论已关闭.