将Child类实例保存在父类型变量中,并通过父变量使用Child函数吗?

时间:2019-09-11 02:47:35

标签: c++ polymorphism liskov-substitution-principle

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

  

错误:“班级鸟”没有名为“攻击”的成员

如何使用功能攻击?另外,打字稿会与之类似吗?

#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;
}

1 个答案:

答案 0 :(得分:0)

变量a指向类型为bird的对象的指针,因此只允许您调用在bird类上定义的方法。这是有道理的-毕竟您不能将所有鸟类都视为老鹰。

您有几种选择:

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

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