C++虚继承

/*
===============================================
* 文件名称:虚继承.cpp
* 创 建 者: mf
* 创建日期:2024年04月09日
* 描述:
    此文件旨在演示C++中的虚继承(Virtual Inheritance)概念及其意义。虚继承主要用于解决多继承中的菱形继承问题,避免了同一基类在派生类中被多次继承导致的数据冗余和二义性问题。

    在本例中,类D通过虚继承分别继承了类B和类C,而类B和类C均虚继承自类A。这意味着尽管类D间接通过两条路径继承了类A,但在类D的实例中只会有一个类A的子对象。

    注意:此处并未涉及虚函数,虚继承和虚函数是两个不同的概念。虚函数用于实现动态多态性,而虚继承则是解决菱形继承问题。
================================================*/

#include <iostream>
#include <string.h> // 注意:在C++中,通常使用<iostream>而非<string.h>,除非确实需要C风格字符串处理函数
using namespace std;

// 基类A,包含一个公共成员变量a
class A
{
public:
    int a = 1; // 类A的成员变量a,初始值为1
};

// 类B虚继承自类A,添加了成员变量b
class B : virtual public A
{
public:
    int b = 2; // 类B的成员变量b,初始值为2
};

// 类C也虚继承自类A,添加了成员变量c
class C : virtual public A
{
public:
    int c = 3; // 类C的成员变量c,初始值为3
};

// 类D同时继承了类B和类C,由于B和C都是虚继承A,所以在类D中只包含一个类A的实例
class D : public B, public C
{
public:
    int d = 4; // 类D的成员变量d,初始值为4
};

// 主函数,创建一个D类对象并访问基类A的成员变量a
int main(int argc, char *argv[])
{
    D d; // 创建D类对象d

    // 因为类D通过虚继承得到了类A的成员,可以直接访问a
    cout << "d.a=" << d.a << endl; // 输出:d.a=1

    return 0;
}

 

关于虚继承的意义:

  • 在菱形继承结构中,通过虚继承确保了基类A在派生类D中只有一份拷贝,节省了内存空间。
  • 虚继承解决了菱形继承可能导致的二义性问题,使得派生类能够唯一无歧义地访问基类A的成员。

相关推荐

  1. C++继承

    2024-04-10 14:10:01       39 阅读
  2. C++——继承与菱形继承

    2024-04-10 14:10:01       53 阅读
  3. C++多继承继承

    2024-04-10 14:10:01       22 阅读

最近更新

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

    2024-04-10 14:10:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 14:10:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 14:10:01       82 阅读
  4. Python语言-面向对象

    2024-04-10 14:10:01       91 阅读

热门阅读

  1. 游戏盾如何防护支付平台免受DDOS攻击

    2024-04-10 14:10:01       37 阅读
  2. 【Spring学习笔记】1. Hello Spring

    2024-04-10 14:10:01       28 阅读
  3. 富格林:可信技巧规避虚假风险

    2024-04-10 14:10:01       34 阅读
  4. Python中的抽象基类(ABC)

    2024-04-10 14:10:01       41 阅读
  5. adb remount

    2024-04-10 14:10:01       31 阅读
  6. Qt之线程的使用

    2024-04-10 14:10:01       34 阅读
  7. 【QT教程】QT6国际化

    2024-04-10 14:10:01       29 阅读
  8. 【前端】eslint 禁用命令

    2024-04-10 14:10:01       25 阅读