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