首页 > 解决方案 > 在成为指向基类的指针后如何保留对子类方法的使用?

问题描述

当我创建一个Animal指针来保存一个Duck对象并使用一个make_choice返回 an的方法时enum,看起来好像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

标签: c++ooppolymorphism

解决方案


std::make_shared<Animal>(duck);没做Duck。它Animal通过复制duck切掉所有DuckAnimal.

你要

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

要不就

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

寻址但是,如果稍后需要将指针存储在 Animal 指针数组中怎么办?从评论中,

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

animals[0] = duckPtr;

是完全合法的。不需要额外的工作。


推荐阅读