#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 的版本
📌 小貼士:多重繼承的優點和注意事項
特性 | 說明 |
---|---|
優點 | 可以讓一個類擁有多個父類的功能,提高代碼復用性 |
缺點 | 容易導致命名沖突、菱形繼承等問題,需要謹慎設計 |
建議 | 如果只是需要接口功能,推薦使用接口類(抽象類 + 純虛函數)代替多重繼承 |
如果你還想了解:
- 如何解決“菱形繼承”問題(使用虛繼承)
- 如何設計接口類
- 如何實現多態
歡迎繼續提問,我可以幫你深入學習 😊