我認爲類型會自動解決最深的部分他們可以。如果Cat : Animal
和你打電話cat->talk()
,如果Cat
覆蓋Animal
類talk()
,貓會說「喵」,而不是一些奇怪的通用Animal
抱怨提供基類Animal
。繼承決議
所以我很困惑這個問題:
struct Animal
{
virtual void talkTo(Animal* o) {
puts("Animal-Animal") ;
}
} ;
struct Cat : public Animal
{
virtual void talkTo(Animal* o) {
puts("Cat-Animal") ;
}
virtual void talkTo(Cat* o) {
puts("Cat says meow to Cat") ;
}
} ;
下面是一些調用代碼:
Cat *cat = new Cat() ;
cat->talkTo(cat) ; //Cat says meow to Cat
Animal *animalCatPtr = cat ;
cat->talkTo(animalCatPtr) ; //Cat-Animal
最後一行在這裏,在這裏我送Cat
到cat->talkTo
,但我使用animalCatPtr
。 animalCatPtr
仍然指代Cat
,但它的解析僅僅是函數調用中的Animal
。
如何使傳遞指針解析爲層次結構中最深的類型,它真的是?我不想做一系列的dynamic_cast<>
測試,看看我手上的Animal
是否真的是Cat
或Dog
或你有什麼。
只有'void(Animal *)'成員函數被覆蓋。另一個是* new *重載,只在'Cat'中定義。 –