首页 > 解决方案 > 将子类实例保存在父类型变量中并通过父变量使用子函数?

问题描述

我有两个班级,分别是 Bird 和 Eagle。鹰是从鸟继承而来的。现在,我可以使用 Bird 类来存储 eagle 类型的实例。但是,当我尝试使用变量调用 eagle 函数时,a 我收到一条错误消息

错误:“类鸟”没有名为“攻击”的成员</p>

我如何使用函数攻击?另外,打字稿会类似吗?

#include <stdio.h>

class bird{
    public:
    void fly(){
        printf("fly");
    }
};

class eagle: public bird{
    public:
    void attack(){
        printf("attack");
    }
};

int main()
{
    bird *a = new eagle();
    a->attack();



    return 0;
}

标签: c++polymorphismliskov-substitution-principle

解决方案


该变量a是指向类型对象的指针bird,因此您只能调用在bird该类上定义的方法。这是有道理的——毕竟你不能把所有的鸟都当作老鹰。

你有几个选择:

  1. 不要调用非bird方法
  2. 将类型更改aeagle*
  3. 用于dynamic_cast解决问题(不推荐,这通常表明您对数据的建模不正确)
dynamic_cast<eagle*>(a)->attack();

文档dynamic_casthttps ://en.cppreference.com/w/cpp/language/dynamic_cast


推荐阅读