当前位置: 首页 > ops >正文

C++多重继承详解与实战解析

#include <iostream>
using namespace std;
//基类,父类
class ClassA {
public:void displayA() {std::cout << "Displaying ClassA" << std::endl;}void testFunc(){std::cout << "testFunc ClassA" << std::endl;}
};
class ClassB {
public:void displayB() {std::cout << "Displaying ClassB" << std::endl;}void testFunc(){std::cout << "testFunc ClassB" << std::endl;}
};
class Derived : public ClassA, public ClassB {
public:void display() {displayA(); // 调用 ClassA 的 displayAdisplayB(); // 调用 ClassB 的 displayBClassA :: testFunc();}
};
int main() {Derived obj;obj.displayA(); // 调用 ClassA 的 displayAobj.displayB(); // 调用 ClassB 的 displayBobj.display(); // 调用 Derived 的 displayreturn 0;
}

当然可以!下面是对这段 C++ 多重继承代码的逐行详细注释解释,帮助你理解类之间的关系、成员函数调用方式以及多重继承的基本用法。


🧱 类定义部分

🔹 ClassA:基类 A

class ClassA {
public:void displayA() {std::cout << "Displaying ClassA" << std::endl;}

说明:定义一个公共成员函数 displayA(),用于输出 "Displaying ClassA"

    void testFunc(){std::cout << "testFunc ClassA" << std::endl;}

说明:另一个公共成员函数 testFunc(),输出 "testFunc ClassA"

};

说明:类 ClassA 定义结束。


🔹 ClassB:基类 B

class ClassB {
public:void displayB() {std::cout << "Displaying ClassB" << std::endl;}

说明:定义一个公共成员函数 displayB(),输出 "Displaying ClassB"

    void testFunc(){std::cout << "testFunc ClassB" << std::endl;}

说明:另一个公共成员函数 testFunc(),输出 "testFunc ClassB"

};

说明:类 ClassB 定义结束。


🔁 Derived:派生类,同时继承自 ClassA 和 ClassB

class Derived : public ClassA, public ClassB {

说明:定义一个派生类 Derived,它公有地继承了两个基类

  • 从 ClassA 公有继承
  • 从 ClassB 公有继承
    这就是 C++ 中的多重继承(Multiple Inheritance)。
public:void display() {displayA(); // 调用 ClassA 的 displayAdisplayB(); // 调用 ClassB 的 displayBClassA::testFunc(); // 显式调用 ClassA 的 testFunc}
};

说明:定义了一个新的成员函数 display(),它内部做了以下几件事:

  • 调用了从 ClassA 继承来的 displayA()
  • 调用了从 ClassB 继承来的 displayB()
  • 使用作用域解析运算符 ClassA::testFunc(),显式调用 ClassA 的 testFunc()
    (因为两个基类都有同名函数,直接调用会歧义)

🚀 主函数部分

int main() {Derived obj;

说明:创建一个 Derived 类的对象 obj

    obj.displayA(); // 调用 ClassA 的 displayA

说明:调用从 ClassA 继承来的 displayA() 方法,输出:

 

深色版本

Displaying ClassA
    obj.displayB(); // 调用 ClassB 的 displayB

说明:调用从 ClassB 继承来的 displayB() 方法,输出:

 

深色版本

Displaying ClassB
 

cpp

深色版本

    obj.display(); // 调用 Derived 的 display

说明:调用自己的方法 display(),依次调用:

  • displayA() → 输出 "Displaying ClassA"
  • displayB() → 输出 "Displaying ClassB"
  • ClassA::testFunc() → 输出 "testFunc ClassA"
 

cpp

深色版本

    return 0;
}

说明:程序正常结束。


✅ 总结输出结果

运行程序后将输出:

 

深色版本

Displaying ClassA
Displaying ClassB
Displaying ClassA
Displaying ClassB
testFunc ClassA

⚠️ 注意事项:函数名冲突问题

  • ClassA 和 ClassB 都有一个叫 testFunc() 的函数。
  • 如果你在 main() 中写:
     cpp 

    深色版本

    obj.testFunc();
    编译器会报错,因为它不知道你要调用哪一个版本。

✅ 正确做法是使用作用域解析运算符指定版本:

obj.ClassA::testFunc(); // 调用 ClassA 的版本
obj.ClassB::testFunc(); // 调用 ClassB 的版本

📌 小贴士:多重继承的优点和注意事项

特性说明
优点可以让一个类拥有多个父类的功能,提高代码复用性
缺点容易导致命名冲突、菱形继承等问题,需要谨慎设计
建议如果只是需要接口功能,推荐使用接口类(抽象类 + 纯虚函数)代替多重继承

如果你还想了解:

  • 如何解决“菱形继承”问题(使用虚继承)
  • 如何设计接口类
  • 如何实现多态

欢迎继续提问,我可以帮你深入学习 😊

http://www.xdnf.cn/news/10401.html

相关文章:

  • C++ —— STL容器——string类
  • xdma 驱动测试与分析
  • Launcher3体系化之路
  • Spring Boot对一些技术框架进行了统一版本号管理
  • vue3常用组件有哪些
  • 【STM32F1标准库】理论——外部中断
  • YOLOv5 环境配置指南
  • 高速串行通信解惑说明
  • 数据结构-排序-排序的七种算法(2)
  • Java流【全】
  • vscode + cmake + ninja+ gcc 搭建MCU开发环境
  • 6v6-导航收录:2025年网站自动引流终极方案 - 提升SEO排名新策略
  • PCIe—TS1/TS2 之Polling.Active(一)
  • Java异步编程:CompletionStage接口详解
  • rv1126b sdk移植
  • QT中更新或添加组件时出现“”qt操作至少需要一个处于启用状态的有效资料档案库“解决方法”
  • 深入理解设计模式之观察者模式
  • 59、干系人概述
  • Windows系统时间怎么设置
  • Centos7 中Gunicorn的安装配置
  • Docker 在云环境中的部署:AWS/ECS 与 Azure/AKS 的实践对比
  • 自动驾驶系统研发系列—激光雷达感知延迟:自动驾驶安全的隐形隐患?
  • opencv使用经典bug
  • OD 算法题 B卷【文件目录大小】
  • 基于ssm+mysql的大创项目申报管理系统(含LW+PPT+源码+系统演示视频+安装说明)
  • 历年中山大学计算机保研上机真题
  • java swing 晃动鼠标改变背景颜色
  • PySide6 GUI 学习笔记——常用类及控件使用方法(标签控件QLabel)
  • Git初识Git安装
  • Spring Boot,两种配置文件