如何在成为指向基类的指针后保留对子类方法的使用?
How to retain use of a child classes method after being made a pointer to the base class?
当我创建一个Animal
指针来保存Duck
对象并使用返回enum
的方法make_choice
时,看起来好像正在使用属于基Animal
类的方法而不是派生的Duck
类。如何保留派生类方法的使用?
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
enum Choice{None, Egg, Bone};
class Animal {
protected:
std::string noise = "None";
public:
Animal() = default;
virtual ~Animal() = default;
virtual std::string getNoise() {
return noise;
}
virtual Choice make_choice(){
return None;
}
};
class Duck : public Animal {
public:
Duck() {
noise = "Quack!";
}
Choice make_choice() override {
return Egg;
}
};
int main() {
Duck duck;
cout << duck.make_choice() << endl; // should be 1 for Egg
std::shared_ptr<Animal> duckPtr = std::make_shared<Animal>(duck);
cout << duckPtr->make_choice() << endl; // also should be 1 for Egg, but is 0 for None
return 0;
};
输出:
1 // for Egg
0 // for None
std::make_shared<Animal>(duck);
没有Duck
。它通过复制duck
和对象切片来制作Animal
,使Duck
与Animal
不同。
你想要
std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>(duck);
或者只是
std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>();
寻址但是,如果指针稍后需要存储在动物指针数组中怎么办?从评论中,
std::shared_ptr<Animal> animals[2];
animals[0] = duckPtr;
是完全合法的。无需额外的工作。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 在静态库中嵌入类方法
- 如何制作一个将函数作为参数的类方法
- 从父类方法返回子类对象
- 使用用户定义的参数调用future/async并调用类方法
- 重载类方法的不明确调用
- 单独定义模板化嵌套类方法的正确语法
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 如何访问由共享指针保存的类方法?
- 将子类方法声明为基类的友元
- 我的模板类方法返回错误类型?
- Qt将信号与另一个类方法连接
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 检查类方法中是否(此 == nullptr)
- 从基类实例调用派生类方法而不进行强制转换
- 函数从唯一代码调用正确的子类方法
- C++ - 如何在不静态的情况下将回调绑定到类方法?
- C++ |DLL / EXE - 如何从导出的类调用另一个类方法?
- 在main中调用类方法,更改不会在类方法之外保留?