简化问题示例:
headline
这会产生错误,没有' bar' '行动'
的成员我意识到这与物体切片有关并且我试图使用指针,这使得矢量能够推倒“能力”。对象,但我无法访问它的' bar'构件。
我错过了什么?
答案 0 :(得分:0)
首先,来自赞助商的一句话:What is object slicing?
现在您已经阅读了上面的链接,您可以看到没有发生切片,因为该对象未被复制到foo
,只复制了指向该对象的指针。 Ability
仍在原封不动的地方test
。
但是...... Foo包含指向Action
的指针,而不是Ability
。 Foo
的用户无法知道Foo
的任何给定元素是否是对Action
,Ability
或Action
的其他子类的引用1}}他们完全不知道。非常强大的东西,能够使用你甚至不知道的东西,但这是有代价的:你必须像你知道的那样使用它。 Foo
的用户只能使用提供给他们的界面,即Action
的界面。有很多方法,例如dynamic_cast,但在大多数情况下,最好坚持使用提供的接口,并允许重载的方法或操作符在幕后做黑魔法,为{{{{{{ 1}}代表。如果这意味着你必须
Action
以后
class Action{
public:
std::string name;
Action(std::string name){
this->name = name;
}
virtual int getbar() = 0; // pure virtual method that all subclasses
// of Action must implement
};
class Ability : public Action{
public:
int bar;
Ability(std::string name) : Action(name){}
int getbar()
{
return bar;
}
};
就这样吧。