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