问题
我的理解是,我们可以通过在基类中将 getNoise
设为虚拟,然后在任何子类中覆盖它来实现多态。然后通过一个指针 vector ,我们存储用于调用方法的基类的地址,例如下面的 getNosie
。
谁能告诉我为什么我的代码不这样做?
代码
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Animals {
private:
std::string noise = "None";
public:
Animals() = default;
virtual ~Animals() = default;
virtual std::string getNoise() {
return noise;
}
};
class Duck : public Animals {
private:
std::string noise = "Quack!";
public:
using Animals::Animals;
std::string getNoise() override {
return noise;
}
};
class Dog : public Animals {
private:
std::string noise = "Bark!";
public:
using Animals::Animals;
std::string getNoise() override {
return noise;
}
};
class AnimalsContainer {
public:
std::vector<Animals *> animals;
Animals *front;
AnimalsContainer() {
Duck duck;
Dog dog;
animals.push_back(&duck);
animals.push_back(&dog);
front = animals[0];
}
~AnimalsContainer() = default;
};
int main() {
AnimalsContainer animals;
cout << animals.front->getNoise() << endl;
预期输出
期待
Quack!
但是我得到了
None
“std::string noise”只能在基类中声明,不能在子类中声明。改为在子类的构造函数中设置噪声值。
我是一名优秀的程序员,十分优秀!