gpt4 book ai didi

c++ - 为什么对 `getNoise` 的调用使用基类实现而不是子类实现?

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:52 24 4
gpt4 key购买 nike

问题

我的理解是,我们可以通过在基类中将 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”只能在基类中声明,不能在子类中声明。改为在子类的构造函数中设置噪声值。

关于c++ - 为什么对 `getNoise` 的调用使用基类实现而不是子类实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59615767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com