C ++虚拟继承没有在基类中命名的成员

时间:2018-10-09 15:49:24

标签: c++

我正在尝试解决一个继承问题,其中派生类Snake从LivingThing-> Animal-> Reptile继承,但是,当我不将virtual void crawl()添加到LivingLiing类时,编译器会说{{ 1}}。现在,我不想在LivingThing中实现一个专门针对Snakes的虚拟虚空。

error: no member named 'crawl' in 'LivingThing'

2 个答案:

答案 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();