c++虚类基础

一、什么是菱形继承问题
当两个子类同时继承同一个父类,再由第四个类同时继承这两个子类,就会产生菱形继承:

  1. 派生类会存有两份父类数据,浪费内存
  2. 直接访问父类成员会出现二义性,编译报错
    二、不加虚继承(报错示例)

include

include

using namespace std;
// 公共父类
class Base
{
public:
string name;
};

// 子类A
class A : public Base {};
// 子类B
class B : public Base {};
// 多继承
class C : public A, public B {};

int main()
{
C c;
// 报错:不知道是A里的name还是B里的name
// c.name = "小林";
return 0;
}
三、使用虚基类解决(正确代码)
只需要在中间子类继承时加上 virtual,公共基类只会存一份:

include

include

using namespace std;

class Base
{
public:
string name;
void show()
{
cout << "名字:" << name << endl;
}
};

// 虚继承公共基类
class A : virtual public Base {};
class B : virtual public Base {};
class C : public A, public B {};
int main()
{
C c;
c.name = "小林";
c.show();
return 0;
}
运行结果
名字:小林
四、核心知识点

  1. 关键字 virtual public 代表虚继承;
  2. 菱形继承场景使用虚基类,公共父类只保留一份副本;
  3. 消除成员访问二义性,节省内存;
  4. 两个中间类都必须加 virtual,只加一个无效。
    五、小结
    虚基类专门用来处理多重菱形继承的冲突,是C++面向对象必考基础知识点,写项目遇到多层多继承时经常用到。
posted @ 2026-06-22 18:32  邱宁宇  阅读(2)  评论(0)    收藏  举报