Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++_Oop_Polymorphism - Fatal编程技术网

C++ 如何在成为指向基类的指针后保留子类方法的使用?

C++ 如何在成为指向基类的指针后保留子类方法的使用?,c++,oop,polymorphism,C++,Oop,Polymorphism,当我创建一个Animal指针来固定Duck对象,并使用一个返回enum的方法make\u choice时,看起来好像使用的是属于基本Animal类的方法,而不是派生的Duck类。如何保留派生类方法的使用 #include <iostream> #include <vector> #include <memory> using namespace std; enum Choice{None, Egg, Bone}; class Animal { prot

当我创建一个
Animal
指针来固定
Duck
对象,并使用一个返回
enum
的方法
make\u 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;
};

std::make_分享所有使
Duck
不同于
动物的东西

你想要

std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>(duck);
std::shared_ptr duckPtr=std::make_shared(duck);
或者只是

std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>();
std::shared_ptr duckPtr=std::make_shared();

寻址但是如果指针以后需要存储在动物指针数组中呢?从评论来看

std::shared_ptr<Animal> animals[2];

animals[0] = duckPtr;
std::共享动物[2];
动物[0]=鸭PTR;
这是完全合法的。不需要额外的工作。

std::make_分享所有使鸭子不同于动物的东西

你想要

std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>(duck);
std::shared_ptr duckPtr=std::make_shared(duck);
或者只是

std::shared_ptr<Animal> duckPtr = std::make_shared<Duck>();
std::shared_ptr duckPtr=std::make_shared();

寻址但是如果指针以后需要存储在动物指针数组中呢?从评论来看

std::shared_ptr<Animal> animals[2];

animals[0] = duckPtr;
std::共享动物[2];
动物[0]=鸭PTR;

这是完全合法的。无需额外工作。

更改
std::共享(duck)
std::使_共享(duck)
但是如果以后指针需要存储在
动物
指针数组中怎么办?不,只需更改右侧,不要更改左侧。更改
std::make_shared(duck)
std::使_共享(duck)
但是如果以后指针需要存储在
动物
指针数组中呢?不,只需更改右手侧,不要更改左手侧。