Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在从用户抽象指针的同时,是否可以支持多态方法调用? 问题_C++_C++11_Pointers_Polymorphism_Smart Pointers - Fatal编程技术网

C++ 在从用户抽象指针的同时,是否可以支持多态方法调用? 问题

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

我试图在我的代码中支持某种程度的多态性。我基本上希望重写子类Dog和Duck中的方法str,然后使用另一个类AnimalContainer中指向超类Animal的智能指针来调用str方法。具体而言,我希望支持以下API:

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(); }
};