如何覆盖派生类中的虚函数?

时间:2018-07-15 07:50:05

标签: c++ class oop inheritance virtual

我正在尝试建立一个练习c ++和oop的动物园。我做了两个类,动物类(基础类)和熊类(派生类)。我想在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";
}

1 个答案:

答案 0 :(得分:2)

如果您定义类似的功能

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