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 类派生。由于 Mammal 和 Bird 是虚继承 Animal,所以 Bat 类中只有一份 Animal 类的数据副本。
  4. main 函数 :创建一个 Bat 对象并调用 eat 方法。因为 Bat 类中只有一份 Animal 类的数据副本,所以调用 eat 方法时不会产生二义性。

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

相关推荐
蒸蒸yyyyzwd13 分钟前
秋招学习笔记 day46
c++·八股
码匠许师傅4 小时前
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务
开发语言·c++·http
无名猿4 小时前
new/delete 与 malloc/free:为什么绝对不能混用
c++·内存管理·现代c++·踩坑记录
2601_962218616 小时前
C++中decltype关键字的实现
开发语言·c++
繁华的地方不一定留下你的脚印7 小时前
C++ std::variant 与 std::visit:安全保存多种类型,写清每个处理分支
开发语言·c++
程序员老陆7 小时前
WIN32_LEAN_AND_MEAN:Windows 头文件里的“精简编译开关”
c++·windows
hold?fish:palm8 小时前
45 二叉树的右视图
开发语言·c++·算法
ShineWinsu8 小时前
对于Redis:Redis的认识以及分布式系统的解析
linux·数据库·c++·redis·缓存·消息队列·分布式架构
布莱克6058 小时前
在C++中,构造函数能不能是虚函数?析构函数为什么要虚?
开发语言·c++·构造函数·析构函数·虚函数
旖旎夜光9 小时前
LeetCode 137 : 只出现一次的数字 II(位运算) —— 题解
c++·笔记·学习·算法·leetcode·力控