将派生类推送到c ++中基类的向量

时间:2016-09-28 14:04:56

标签: c++ c++11 inheritance vector

我有以下代码:

class Official {
    public:
        explicit Official(int iRow, int iColumn, int iRankHolder, int** aiBoardHolder);
};

class General : public Official {
    public: 
        explicit General(int iRow, int iColumn, int iRankHolder, int** aiBoardHolder) : Official(iRow, iColumn, iRankHolder, aiBoardHolder) {};
};

class Map {
    private:
        std::vector<Official> aoOfficialStack;

    public:
        void generateOfficialObject();
};

void Map::generateOfficialObject() {
    aoOfficialStack.push_back(General(1, 2, 3, aiBoardPosition));
}

问题是为什么我在调用generateOfficalObject()后会出现此错误?

错误C2664'void std :: vector&gt; :: push_back(const Official&amp;)':无法将参数1从'General'转换为'Official&amp;&amp;'项目c:\ users \ user \ desktop \ project \ project \ board \ board.cpp 12

非常感谢!

2 个答案:

答案 0 :(得分:2)

您的示例程序compiles。您的示例不完整,或者您的编译器不符合标准。

该计划已经很好地形成并且已经定义了行为。然而,行为可能不是您所期望的。对象切片是一种模糊的语言功能,初学者可能会发现违反直觉。如果您只打算使用Official子对象,则创建Official的实例是没有意义的。问问自己:为什么不首先创建function playaudio(p){ sound.pause(); $("#audiovoix")[0].currentTime = 0; $("#audiovoix").attr("src", "fiches_visite/"+id+"/audio/"+p+"_FR.mp3"); console.log("fiches_visite/"+id+"/audio/"+p+"_FR.mp3"); sound.load(); sound.play(); sound.onerror = function() { console.log("fichier introuvable"); itvl = setTimeout(function() { $('#slider_suivant').trigger('click'); }, tempo); }; } 的实例?

答案 1 :(得分:0)

这是一个c ++限制。您不能将派生类的值分配给它的基类而不会产生任何后果。这可能会编译但会导致一些意外行为。它可以将对象复制到基类的实例中(这会丢失它从派生类中获取的信息)。这称为object slicing

您必须使用引用或指针。所以你可以将你的矢量改为

std::vector<std::unique_ptr<Official>> aoOfficialStack;

并指定如:

aoOfficialStack.push_back(std::make_unique<General>(1, 2, 3, aiBoardPosition));

shared_ptr也是一种替代方案,取决于用途。