我正在尝试解决一个继承问题,其中派生类Snake从LivingThing-> Animal-> Reptile继承,但是,当我不将virtual void crawl()
添加到LivingLiing类时,编译器会说{{ 1}}。现在,我不想在LivingThing中实现一个专门针对Snakes的虚拟虚空。
error: no member named 'crawl' in 'LivingThing'
答案 0 :(得分:5)
snake->crawl();
尝试通过crawl
访问LivingThing*
,而没有v表引用,LivingThing*
无法调用Snake::crawl
。
在当前示例中,您只需将LivingThing
指针更改为Snake
指针即可。
在更复杂的情况下:
如果您知道要调用crawl
的指针指向实际上是Snake
的对象,则可以static_cast
指针。
if(Snake* snake = static_cast<Snake*>(livingThing))
snake->crawl();
如果您不能保证生物实际上是Snake
,并且有rtti
可用,则可以使用dynamic_cast
。
if(Snake* snake = dynamic_cast<Snake*>(livingThing))
snake->crawl();
答案 1 :(得分:3)
将对象转换为基类型时,只能使用在此基类中声明的方法。因此,如果您不想在基本类型中声明crawl
方法,则必须在使用此方法之前向下转换对象:
LivingThing *creature = new Snake();
creature->breathe();
if(Snake* snake = dynamic_cast<Snake*>(creature)) snake->crawl();