課程
/后端開發
/C++
/趣味 C++ 進階
???????
2024-10-16
源自:趣味 C++ 進階 5-6
正在回答
從你的描述來看,你對于為什么在某些情況下需要將指針定義為基類(父類)指針而不是直接定義為派生類(子類)指針感到困惑。這種做法主要涉及到面向對象編程中的多態性概念。下面我將解釋這一問題,并給出一個簡單的例子來說明。
假設我們有一個基類?Animal?和兩個派生類?Dog?和?Cat。每個動物都有一個?makeSound()?方法,但不同種類的動物會發出不同的聲音。
Animal
Dog
Cat
makeSound()
#include?<iostream> using?namespace?std; //?基類 class?Animal?{ public: ????virtual?void?makeSound()?const?=?0;?//?純虛函數,使得Animal成為抽象類 }; //?派生類?Dog class?Dog?:?public?Animal?{ public: ????void?makeSound()?const?override?{ ????????cout?<<?"Bark?Bark"?<<?endl; ????} }; //?派生類?Cat class?Cat?:?public?Animal?{ public: ????void?makeSound()?const?override?{ ????????cout?<<?"Meow?Meow"?<<?endl; ????} };
如果我們有一個函數接受一個?Animal*?類型的參數,那么這個函數就可以處理任意類型的動物:
Animal*
void?animalSound(Animal?*animal)?{ ????animal->makeSound(); }
這樣做的好處是顯而易見的:無論將來添加多少種新的動物類型(如?Bird,?Fish?等),只要它們是從?Animal?繼承而來并實現了?makeSound()?方法,就都可以被?animalSound?函數正確地處理。
animalSound
int?main()?{ ????Dog?dog; ????Cat?cat; ????animalSound(&dog);??//?輸出:?Bark?Bark ????animalSound(&cat);??//?輸出:?Meow?Meow ???? ????return?0; }
通過這種方式,不僅提高了代碼的復用性,也增強了程序結構的清晰度。希望這個解釋能夠幫助你理解為何通常建議使用基類指針而非具體派生類指針的原因。如果你有更多關于C++或其他編程相關的問題,歡迎繼續提問!
舉報
本課程是 C++ 的進階課程,繼續趣味學習之旅,帶你探索 C++ 的高級用法。
1 回答為什么不在類里面定義成員函數?
1 回答子類轉換為父類為什么要用顯式轉換
1 回答空指針怎么解決
1 回答為什么要重載運算符=?
1 回答野指針問題
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2024-11-05
從你的描述來看,你對于為什么在某些情況下需要將指針定義為基類(父類)指針而不是直接定義為派生類(子類)指針感到困惑。這種做法主要涉及到面向對象編程中的多態性概念。下面我將解釋這一問題,并給出一個簡單的例子來說明。
問題核心
示例
假設我們有一個基類?
Animal
?和兩個派生類?Dog
?和?Cat
。每個動物都有一個?makeSound()
?方法,但不同種類的動物會發出不同的聲音。基礎定義
使用場景
如果我們有一個函數接受一個?
Animal*
?類型的參數,那么這個函數就可以處理任意類型的動物:這樣做的好處是顯而易見的:無論將來添加多少種新的動物類型(如?Bird,?Fish?等),只要它們是從?
Animal
?繼承而來并實現了?makeSound()
?方法,就都可以被?animalSound
?函數正確地處理。測試代碼
通過這種方式,不僅提高了代碼的復用性,也增強了程序結構的清晰度。希望這個解釋能夠幫助你理解為何通常建議使用基類指針而非具體派生類指針的原因。如果你有更多關于C++或其他編程相關的問題,歡迎繼續提問!