我有以下代码:
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
非常感谢!
答案 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
也是一种替代方案,取决于用途。