c ++ std :: vector类的基类对象----派生类的运行方法

时间:2018-02-06 19:32:58

标签: java c++ c++11 vector

我想问一下Java中的“instanceof”。我创建了一个简单的继承示例。我的想法是一个abstarct类怪物和儿童骷髅和僵尸,但抽象它不起作用,所以我们有std :: vectorBase类。我将儿童对象推入矢量。我想调用子类的方法,但被调用的方法是基类空方法。有现成的方法吗?也许在c ++编程中我们应该避免这种代码思考并分别使用矢量骨架和矢量僵尸来做它?对不起我的英语不好。我希望你理解我的问题。

_split_indices

2 个答案:

答案 0 :(得分:0)

如上所述,由于您只存储了向量中所有对象的Monster部分,因此您遇到了切片。 您可以使用std::vector<Monster*>或者从c ++ 11 std::vector<std::unique_ptr<Monster>>开始,将指针/ unique_ptr存储到向量中的Monster。存储指向实际对象的指针可以减少切片,因为对象不是直接存储在向量中,而只是对堆上实际对象的引用,就像默认情况下使用Java一样。

如果你真的需要价值语义,你应该看一下boost.polycollection,但这是一个相当高级的话题恕我直言。

答案 1 :(得分:0)

感谢您的回答。我无法为你添加积分,因为我是“堆叠”的新手。我读到了这个问题,我写了一个解决方案。如果有人需要这个。

#include <iostream>
#include <vector>
#include <memory>


class Monster
{
public:
    virtual void describe() {};
    virtual std::unique_ptr<Monster> copy_class()
    { 
        return std::unique_ptr<Monster>(std::make_unique<Monster>()); 
    }

};

class Skeleton : public Monster 
{
protected:
    const int life = 100;
public:
    Skeleton() {

    }
    ~Skeleton(){}
    void describe() override final {
        std::cout << "I am skeleton" << std::endl;
    }
    std::unique_ptr<Monster> copy_class() override 
    { 
        return std::unique_ptr<Monster>(std::make_unique<Skeleton>()); 
    }
};


class Zombie : public Monster
{
public:
    Zombie(){}
    ~Zombie(){}
    void describe() override {
        std::cout << "I am zombie" << std::endl;
    }
    std::unique_ptr<Monster> copy_class() override
    { 
        return std::unique_ptr<Monster>(std::make_unique<Zombie>());
    }
};


class UpgradeSkeleton final: public Skeleton
{
public:
    UpgradeSkeleton(){}
    ~UpgradeSkeleton() {}
    std::unique_ptr<Monster> copy_class() override { return std::unique_ptr<Monster>(std::make_unique<UpgradeSkeleton>()); }
};

int main(void) {

    std::vector<std::unique_ptr<Monster>> monsters;

    Skeleton s;
    Zombie z;
    UpgradeSkeleton us;

    monsters.push_back(std::unique_ptr<Monster>(s.copy_class()));
    monsters.push_back(std::unique_ptr<Monster>(z.copy_class()));
    monsters.push_back(std::unique_ptr<Monster>(us.copy_class()));



    for (auto &p : monsters) {
        p->describe();
    }

    std::cin.get();
    return 0;

}