C++中的虚基类

虚基类的概念

虚基类(Virtual Base Class)用于解决多重继承中的菱形继承问题(即一个派生类通过多条路径继承同一个基类)。通过virtual关键字声明基类,确保派生类中只保留一份基类子对象,避免数据冗余和二义性。

虚基类的作用

  • 避免二义性:解决派生类调用基类成员时的歧义问题。
  • 节省内存:确保多重继承时基类子对象只存在一份。

示例代码

以下例子展示菱形继承中虚基类与非虚基类的区别:

未使用虚基类(存在二义性)
cpp 复制代码
#include <iostream>
using namespace std;

class Base {
public:
    int data;
    Base() : data(10) {}
};

class Derived1 : public Base {};  // 普通继承
class Derived2 : public Base {};  // 普通继承

class Final : public Derived1, public Derived2 {};  // 菱形继承

int main() {
    Final obj;
    // cout << obj.data << endl;  // 错误:ambiguous(二义性)
    cout << obj.Derived1::data << endl;  // 必须显式指定路径
    cout << obj.Derived2::data << endl;
    return 0;
}

输出

复制代码
10  
10  
使用虚基类(解决二义性)
cpp 复制代码
#include <iostream>
using namespace std;

class Base {
public:
    int data;
    Base() : data(10) {}
};

class Derived1 : virtual public Base {};  // 虚继承
class Derived2 : virtual public Base {};  // 虚继承

class Final : public Derived1, public Derived2 {};  // 菱形继承

int main() {
    Final obj;
    cout << obj.data << endl;  // 直接访问,无二义性
    return 0;
}

输出

复制代码
10  

关键点

  • 虚继承语法 :在派生类声明时使用virtual关键字,如class Derived1 : virtual public Base
  • 内存模型 :虚基类的构造函数由最终派生类(如Final)直接调用,确保只初始化一次。

通过虚基类,C++实现了对菱形继承的优雅处理,避免数据冗余和成员访问冲突。

相关推荐
地平线开发者8 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮8 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者9 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考9 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx12 小时前
CART决策树基本原理
算法·机器学习
Wect13 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱13 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
肆忆_16 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星20 小时前
虚函数表:C++ 多态背后的那个男人
c++
Gorway20 小时前
解析残差网络 (ResNet)
算法