【发布时间】:2013-09-24 15:49:57
【问题描述】:
我认为类型会自动解析到他们可以层次结构的最深部分。如果Cat : Animal 并且你调用cat->talk(),如果Cat 覆盖talk() 类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中定义。
标签: c++ inheritance overload-resolution