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:派生类,同时继承自 ClassA 和 ClassB
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(),显式调用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 的版本
📌 小贴士:多重继承的优点和注意事项
| 特性 | 说明 |
|---|---|
| 优点 | 可以让一个类拥有多个父类的功能,提高代码复用性 |
| 缺点 | 容易导致命名冲突、菱形继承等问题,需要谨慎设计 |
| 建议 | 如果只是需要接口功能,推荐使用接口类(抽象类 + 纯虚函数)代替多重继承 |
如果你还想了解:
- 如何解决"菱形继承"问题(使用虚继承)
- 如何设计接口类
- 如何实现多态
欢迎继续提问,我可以帮你深入学习 😊