• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

多重继承和虚基类

C/C++基础 弦苦 1152次浏览 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)来解决二义性的问题。虚基类只是一种派生的方式,类层次结构中某个虚基类成员只出现一次,即基类的一个副本被所有派生类对象共享。修改上例代码中BC的派生方式则d1.a=100;是合法的。

多重继承和虚基类

class B:public virtual A

{

public:

     int b;//a,b

};

class C:public virtual A

{

public:

     int c;//a,c

};


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明多重继承和虚基类
喜欢 (0)

您必须 登录 才能发表评论!

加载中……