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关键字谁在前谁在后都行。

相关推荐

  1. C++继承

    2024-06-17 07:54:05       40 阅读
  2. C++——继承与菱形继承

    2024-06-17 07:54:05       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 07:54:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 07:54:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 07:54:05       87 阅读
  4. Python语言-面向对象

    2024-06-17 07:54:05       96 阅读

热门阅读

  1. 【Python】 Stacking: 强大的集成学习方法

    2024-06-17 07:54:05       36 阅读
  2. Flutter 实现StackAllocator简化FFI局部变量的内存管理

    2024-06-17 07:54:05       35 阅读
  3. python 异常处理、随机数、

    2024-06-17 07:54:05       32 阅读