/*
===============================================
* 文件名称:虚继承.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的成员。