c++虚类基础
一、什么是菱形继承问题
当两个子类同时继承同一个父类,再由第四个类同时继承这两个子类,就会产生菱形继承:
- 派生类会存有两份父类数据,浪费内存
- 直接访问父类成员会出现二义性,编译报错
二、不加虚继承(报错示例)
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;
}
运行结果
名字:小林
四、核心知识点
- 关键字 virtual public 代表虚继承;
- 菱形继承场景使用虚基类,公共父类只保留一份副本;
- 消除成员访问二义性,节省内存;
- 两个中间类都必须加 virtual,只加一个无效。
五、小结
虚基类专门用来处理多重菱形继承的冲突,是C++面向对象必考基础知识点,写项目遇到多层多继承时经常用到。
浙公网安备 33010602011771号