为什么在基类指针向量中访问派生类成员会返回错误?

时间:2016-11-26 03:29:46

标签: c++

简化问题示例:

headline

这会产生错误,没有' bar' '行动'

的成员

我意识到这与物体切片有关并且我试图使用指针,这使得矢量能够推倒“能力”。对象,但我无法访问它的' bar'构件。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

首先,来自赞助商的一句话:What is object slicing?

现在您已经阅读了上面的链接,您可以看到没有发生切片,因为该对象未被复制到foo,只复制了指向该对象的指针。 Ability仍在原封不动的地方test

但是...... Foo包含指向Action的指针,而不是AbilityFoo的用户无法知道Foo的任何给定元素是否是对ActionAbilityAction的其他子类的引用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;
    }
};

就这样吧。