C++ 在从用户抽象指针的同时,是否可以支持多态方法调用? 问题
我试图在我的代码中支持某种程度的多态性。我基本上希望重写子类Dog和Duck中的方法str,然后使用另一个类AnimalContainer中指向超类Animal的智能指针来调用str方法。具体而言,我希望支持以下API:C++ 在从用户抽象指针的同时,是否可以支持多态方法调用? 问题,c++,c++11,pointers,polymorphism,smart-pointers,C++,C++11,Pointers,Polymorphism,Smart Pointers,我试图在我的代码中支持某种程度的多态性。我基本上希望重写子类Dog和Duck中的方法str,然后使用另一个类AnimalContainer中指向超类Animal的智能指针来调用str方法。具体而言,我希望支持以下API: int main(){ Duck duck; Dog dog; AnimalContainer duckInContainer(duck); std::cout << duckInContainer.str() << s
int main(){
Duck duck;
Dog dog;
AnimalContainer duckInContainer(duck);
std::cout << duckInContainer.str() << std::endl; // Outputs "None" but should output "Duck"
AnimalContainer dogInContainer(dog);
std::cout << dogInContainer.str() << std::endl; // Outputs "None" but should output "Dog"
}
是否可以执行上述操作?如果可以,我需要对以下代码进行哪些更改:
代码
如果没有克隆功能,您可以执行以下操作:
class AnimalContainer {
private:
AnimalPtr animal_ptr;
public:
explicit AnimalContainer(const Dog& dog){
this->animal_ptr = std::make_unique<Dog>(dog);
}
// Same for Duck
explicit AnimalContainer(AnimalPtr animal_ptr){
this->animal_ptr = std::move(animal_ptr));
}
std::string str(){ return this->animal_ptr->str(); }
};
或者更一般地说:
class AnimalContainer {
private:
AnimalPtr animal_ptr;
public:
template <typename T>
explicit AnimalContainer(const T& animal){
this->animal_ptr = std::make_unique<T>(animal);
}
explicit AnimalContainer(AnimalPtr animal_ptr){
this->animal_ptr = std::move(animal_ptr));
}
std::string str(){ return this->animal_ptr->str(); }
};
什么abaout AnimalPtr aptr=std::make_uniqueDog?您是AnimalContainer构造函数,它获取一个对象并对其进行复制,但只使用导致切片的基类。您将要复制到层次结构,然后在构造函数中克隆?
this->animal_ptr = std::make_unique<Animal>(animal);
std::unique_ptr<Dog> dog_ptr = std::make_unique<Dog>(Dog())
class AnimalContainer {
private:
AnimalPtr animal_ptr;
public:
explicit AnimalContainer(const Dog& dog){
this->animal_ptr = std::make_unique<Dog>(dog);
}
// Same for Duck
explicit AnimalContainer(AnimalPtr animal_ptr){
this->animal_ptr = std::move(animal_ptr));
}
std::string str(){ return this->animal_ptr->str(); }
};
class AnimalContainer {
private:
AnimalPtr animal_ptr;
public:
template <typename T>
explicit AnimalContainer(const T& animal){
this->animal_ptr = std::make_unique<T>(animal);
}
explicit AnimalContainer(AnimalPtr animal_ptr){
this->animal_ptr = std::move(animal_ptr));
}
std::string str(){ return this->animal_ptr->str(); }
};