C++类_虚基类

在 C++ 里,虚基类是用来解决菱形继承问题的。菱形继承问题是指当一个派生类从两个或更多基类派生,而这些基类又从同一个基类派生时,派生类会包含多份间接基类的数据副本,这可能会引发数据冗余和二义性问题。虚基类可以保证在派生类中只存在一份间接基类的数据副本。

下面是一个 C++11 中使用虚基类的例子:

cpp 复制代码
#include <iostream>

// 基类
class Animal {
public:
    Animal() {
        std::cout << "Animal constructor" << std::endl;
    }
    void eat() {
        std::cout << "Animal is eating" << std::endl;
    }
};

// 中间派生类,使用虚继承
class Mammal : virtual public Animal {
public:
    Mammal() {
        std::cout << "Mammal constructor" << std::endl;
    }
};

// 中间派生类,使用虚继承
class Bird : virtual public Animal {
public:
    Bird() {
        std::cout << "Bird constructor" << std::endl;
    }
};

// 最终派生类,继承自 Mammal 和 Bird
class Bat : public Mammal, public Bird {
public:
    Bat() {
        std::cout << "Bat constructor" << std::endl;
    }
};

int main() {
    Bat bat;
    bat.eat();

    return 0;
}
    

代码解释:

  1. Animal :这是最基础的类,有一个构造函数和 eat 方法。
  2. Mammal 类和 Bird :它们都虚继承自 Animal 类,这意味着在后续的派生类中,Animal 类的数据成员和成员函数只会有一份副本。
  3. Bat :它从 Mammal 类和 Bird 类派生。由于 MammalBird 是虚继承 Animal,所以 Bat 类中只有一份 Animal 类的数据副本。
  4. main 函数 :创建一个 Bat 对象并调用 eat 方法。因为 Bat 类中只有一份 Animal 类的数据副本,所以调用 eat 方法时不会产生二义性。

运行这个程序,你会看到 Animal 类的构造函数只被调用了一次,这就表明在 Bat 类中只有一份 Animal 类的数据副本。

相关推荐
xiaoye-duck26 分钟前
《算法题讲解指南:优选算法-队列+宽搜》--70.N叉树的层序遍历,71.二叉树的锯齿形层序遍历,72.二叉树的最大宽度,73.在每个树行中找最大值
数据结构·c++·算法·队列
代码改善世界27 分钟前
【C++初阶】双向循环链表:List底层结构的完整实现剖析
c++·链表·list
REDcker30 分钟前
C++ 包管理工具概览
开发语言·c++
努力努力再努力wz33 分钟前
【C++高阶系列】告别内查找局限:基于磁盘 I/O 视角的 B 树深度剖析与 C++ 泛型实现!(附B树实现源码)
java·linux·开发语言·数据结构·c++·b树·算法
承渊政道34 分钟前
【优选算法】(实战攻坚BFS之FloodFill、最短路径问题、多源BFS以及解决拓扑排序)
数据结构·c++·笔记·学习·算法·leetcode·宽度优先
lcj25111 小时前
字符函数,字符串函数,内存函数
c语言·开发语言·c++·windows
吃着火锅x唱着歌1 小时前
深度探索C++对象模型 学习笔记 第三章 Data语意学(2)
c++·笔记·学习
Imxyk1 小时前
P9242 [蓝桥杯 2023 省 B] 接龙数列
c++·算法·图论
郝学胜-神的一滴1 小时前
二叉树后序遍历:从递归到非递归的优雅实现
数据结构·c++·程序人生·算法·
亚马逊云开发者1 小时前
GameLift Servers DDoS防护实战:Player Gateway + Ping Beacons延迟优化 + C++ SDK集成
c++·gateway·ddos