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 类的数据副本。

相关推荐
李匠20247 分钟前
C++负载均衡远程调用学习之异步消息任务功能与连接属性
c++·学习
桦023 分钟前
[蓝桥杯真题题目及解析]2025年C++b组
c++·职场和发展·蓝桥杯
虾球xz27 分钟前
游戏引擎学习第255天:构建配置树
c++·学习·游戏引擎
海码0078 小时前
【Hot 100】 146. LRU 缓存
数据结构·c++·算法·链表·缓存·hot100
工藤新一¹8 小时前
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 20)
c++·单例模式·游戏引擎·sdl·c++游戏开发
我是一只鱼02239 小时前
LeetCode算法题 (设计链表)Day16!!!C/C++
数据结构·c++·算法·leetcode·链表
hi0_69 小时前
Linux 第六讲 --- 工具篇(一)yum/apt与vim
linux·服务器·c++·vim·yum
wjm0410069 小时前
C++八股--5--设计模式--适配器模式,代理模式,观察者模式
c++·设计模式·适配器模式
小羊在奋斗10 小时前
基于C++、JsonCpp、Muduo库实现的分布式RPC通信框架
c++·分布式·rpc