classA{public:voidShow(){std::cout<<"A::Show/n";}};classB:publicA{public:voidShow(){std::cout<<"B::Show/n";}voidDisplay(){Show();//调用派生类B的成员函数,覆盖掉继承自基类的Show()成员方法A::Show();//调" />

多重继承和虚基类

系统 1561 0

// 派生类成员函数对基类成员函数的覆盖

#include "stdafx.h"

#include <iostream>

class A

{

public :

void Show()

{

std::cout<< "A::Show/n" ;

}

};

class B: public A

{

public :

void Show()

{

std::cout<< "B::Show/n" ;

}

void Display()

{

Show(); // 调用派生类 B 的成员函数,覆盖掉继承自基类的 Show() 成员方法

A::Show(); // 调用基类 A 的成员函数

}

};

int _tmain( int argc, _TCHAR* argv[])

{

A a;

B b;

a.Show();

b.Show();

b.Display();

std::cin.get();

return 0;

}

程序运行的结果:

A::Show

B::Show

B::Show

A::Show

一个派生类对象含有基类的数据成员的一个副本,在 C++ 类的多重继承结构中,由于多层次的交叉派生关系,一个派生类中可能保留某个基类的多个实例。例如,在下图中, B:A,C:A,D:B,D:C, 这是在派生类 D 的对象中存在间接基类 A 的两份副本。当试图通过派生类对象直接访问基类 A 中的成员是,将会导致编译二义性错误。

多重继承和虚基类

// 多重继承的副本二义性

class A

{

public :

int a; //a

};

class B: public A

{

public :

int b; //a,b

};

class C: public A

{

public :

int c; //a,c

};

class D: public B, public C

{

public :

int d; //(a,b),(a,c),d

};

int _tmain( int argc, _TCHAR* argv[])

{

D d1;

d1.a=100; // 此处 a 具有二义性,编译器无法确定 a 是那个副本

d1.B::a=100; // 指明访问的是通过 B 类间接派生的

d1.C::a=100; // 指明访问的是通过 C 类间接派生的

return 0;

}

编译结果: error C2385: ambiguous access of 'a'

若注释掉 d1.a=100; 则编译通过。

在多重继承中, C++ 提供了虚基类( virtual base class )来解决二义性的问题。虚基类只是一种派生的方式,类层次结构中某个虚基类成员只出现一次,即基类的一个副本被所有派生类对象共享。修改上例代码中 B C 的派生方式则 d1.a=100; 是合法的。

多重继承和虚基类

class B: public virtual A

{

public :

int b; //a,b

};

class C: public virtual A

{

public :

int c; //a,c

};

多重继承和虚基类


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论