【问题标题】:How can I override a virtual function in a derived class?如何覆盖派生类中的虚函数?
【发布时间】:2018-12-23 02:09:42
【问题描述】:

我正在尝试建立一个练习 c++ 和 oop 的动物园。我做了 2 个类,Animal 类(基类)和 Bear 类(派生类)。我想在 Animal 中有 2 个虚函数,我将在 Bear 中覆盖它们,但 CLION 告诉我“Function Walk 没有在 Bear 类中清除”。

我需要改变什么?

这是基类(动物)头:

class Animal {
public:
    Animal();
    Animal(string Name, int CageNum, string FoodType, string Gender, bool NeedTreatment);

    virtual void Talk() = 0;
    virtual void Walk();
    int CageNum;
    string FoodType;
    string Gender;
    bool NeedTreatment;
    string Name;
};

CPP:

Animal::Animal() {};
Animal::Animal(string Name, int CageNum, string FoodType, string Gender, bool NeedTreatment) :
        Name(Name), CageNum(CageNum), FoodType(FoodType), Gender(Gender), NeedTreatment(NeedTreatment){};

这是派生类(Bear)头:

#include "Animal.h"

class Bear : public Animal{
protected:
    string FurColor;
public:
    Bear(string Name, int CageNum, string FoodType, string Gender, bool NeedTreatment,string FurColor);

};

这就是 CPP:

#include "Bear.h"
Bear::Bear(string Name, int CageNum, string FoodType, string Gender, bool NeedTreatment,string FurColor) :
        Animal(Name, CageNum, FoodType, Gender, NeedTreatment),FurColor(FurColor) {};
void Bear::Walk() {
    cout << "Bear Moves";
}
void Animal::Talk() {
    "Bear Noise";
}

【问题讨论】:

  • 真正的错误信息是什么?

标签: c++ class oop inheritance virtual


【解决方案1】:

如果你定义一个类似的函数

void Bear::Walk() {
    cout << "Bear Moves";
}

它的声明必须出现在类定义中:

class Bear : public Animal{
protected:
    string FurColor;
public:
    Bear(string Name, int CageNum, string FoodType, string Gender, bool NeedTreatment,string FurColor);
    void Walk() override; // <<<<<<<<<<<<<<<<<<
};

您也可以省略定义,而使用基类成员定义Animal::Walk()


还有

void Animal::Talk() {
    "Bear Noise";
}

是错误的(或最终没有做预期的事情)。

纯虚函数,如基类中的Talk(),必须在Bear 类中有声明和定义,除非该类有意保留为抽象。

class Bear : public Animal{
protected:
    string FurColor;
public:
    Bear(string Name, int CageNum, string FoodType, string Gender, bool NeedTreatment,string FurColor);
    void Talk() override; // <<<<<<<<<<<<<<<<<<
    void Walk() override;
};

和定义

void Bear::Talk() {
    "Bear Noise";
}

【讨论】:

  • 我想在animal类中声明虚方法,在Bear类中实现
  • @YoavLinder 如前所述,有定义的东西也必须有相同范围内的声明。
  • 那么使用虚函数的原因是什么?我可以在所有派生类中声明这些函数
  • @FrancisCugler *“这确保了派生方法类将在基类版本上被调用......”它没有这样的事情。 override 是编译器的说明符,用于检查函数是否为虚函数以及它是否覆盖了基类中的虚函数,否则会发出错误。换句话说,它在编译时检查以确保您实际上覆盖了基类函数,并且与运行时调用无关。见:en.cppreference.com/w/cpp/language/override
  • @FrancisCugler 差不多。 :P 同样,它只与声明有关,与是否调用函数无关。 “......已经宣布”将是一个更好的词选择。 :)
猜你喜欢
  • 2014-01-15
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2012-02-24
  • 1970-01-01
  • 2020-11-05
  • 2020-06-27
相关资源
最近更新 更多