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

cpp 复制代码
#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 的 displayA
        displayB(); // 调用 ClassB 的 displayB
        ClassA :: testFunc();
    }
};
int main() {
    Derived obj;
    obj.displayA(); // 调用 ClassA 的 displayA
    obj.displayB(); // 调用 ClassB 的 displayB
    obj.display(); // 调用 Derived 的 display
    return 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:派生类,同时继承自 ClassAClassB

复制代码
class Derived : public ClassA, public ClassB {

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

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

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

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

🚀 主函数部分

复制代码
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

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

  • ClassAClassB 都有一个叫 testFunc() 的函数。

  • 如果你在 main() 中写:

    复制代码

    cpp

    深色版本

    复制代码
    obj.testFunc();

    编译器会报错,因为它不知道你要调用哪一个版本。

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

复制代码
obj.ClassA::testFunc(); // 调用 ClassA 的版本
obj.ClassB::testFunc(); // 调用 ClassB 的版本

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

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

如果你还想了解:

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

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

相关推荐
奈斯先生Vector5 分钟前
本地图片识别怎么接入多模态 AI?用 Python API 理解 GPT-4o Vision 的真实工作流
开发语言·人工智能·windows·python·网络协议·http·aigc
OPEN-F9 分钟前
C++17新特性精讲:结构化绑定、if constexpr与实用类型
开发语言·c++
OPEN-F12 分钟前
C++并发编程:线程与互斥锁
开发语言·c++
俊昭喜喜里14 分钟前
C#中的decimal
开发语言·c#
码匠许师傅15 分钟前
【设计模式精讲】11.桥接模式(Bridge)
c++·设计模式·桥接模式·uml
小小、码农22 分钟前
【网络】套接字(Socket)编程——TCP版
linux·服务器·网络·c++·网络协议·tcp/ip
catchadmin24 分钟前
免费可商用 PHP 管理后台 CatchAdmin V5.4.0 发布,新增短信服务能力
开发语言·php
天空之城--32 分钟前
C++ ODR-use 深度解析:从原理到实战
c++
小白学大数据35 分钟前
API 调用错误处理实战:分层定位、有纪律地重试与可观测性设计
开发语言·网络·人工智能
旖旎夜光1 小时前
LeetCode 974:和可被 K 整除的子数组(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和