C++ virtual public(虚继承类)

     这个"virtual"有什么作用?

由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了。

典型的需要用虚基类的情况如下:

其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承,即多继承中经常提到的“菱形结构”。

#include<stdio.h>
class A
{
public:
    void Echo()   
    {   
        printf( "Echo");
    } 
}; 

class B: public A
{
};

class C: public A
{
};

class D: public B, public C
{
};

void main() 
{ 
    D d; 
    d.Echo();   //   出现错误.此处函数调用不明确. 
} 

此时调用d.Echo(),就会有二义性问题,编译器会报Echo函数调用不明确,如下:

如果将B、C类改为像如下那样从A类虚拟继承,则不会存在有二义性问题,编译器不会报错。

#include<stdio.h>
class A
{
public:
    void Echo()   
    {   
        printf( "Echo");
    } 
}; 

class B: public virtual A
{
};

class C: virtual public A
{
};

class D: public B, public C
{
};

int main() 
{ 
    D d; 
    d.Echo();   //  正确,编译器不会报错. 
    
    return 0;
} 

说明:public virtual写成virtual public也是可以的,即public、 virtual关键字谁在前谁在后都行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值