我可以覆盖抽象基类的成员吗?

时间:2013-12-31 07:42:12

标签: c++ polymorphism

我不确定我是否正确地写了这个问题,所以我将从一些代码开始。这不是来自我的计划,但希望它足以让我们了解这个概念。

class AbstractClass {

public:
    typedef std::unique_ptr<AbstractClass> Ptr;
    std::vector<Ptr> mChildren;
    void AddChild(Ptr child);
    void Render();
}


class Derived {

public:
typedef std::unique_ptr<Derived> Ptr;
std::vector<Ptr> mChildren;

private:
void CheckChildren();
}

正如你所看到的,我基本上是“覆盖”抽象类的“mChildren”。这适用于我的Render()方法,它使用mChildren递归渲染所有子项。但是,当我尝试从派生类调用CheckChildren()时,mChildren显示为空。

这是在调用

之后
AddChild(std::move(new Derived));

方法也是。问题是,我的Render方法工作正常,这意味着mChildren不是空的。看来我无法从派生类中正确地看到集合。我确信这可能主要是没有正确封装孩子的问题,但我很难解决如何解决这个问题。

将mChildren作为私人会员帮助吗?我只是试图让mChildren变为私有并创建一个返回指向向量的指针的getter,但VS不允许我的派生类的getter返回指向派生类向量的指针。

总结一下 - 我需要能够访问集合,因为它是所有的AbstractClass :: Ptr,但我需要能够使用更多方法将Derived :: Ptr修改为Derived对象。

2 个答案:

答案 0 :(得分:2)

您的代码存在一些问题 - 我无法进入所有问题(现在没时间) - 但是:

class Derived {

public:
....
std::vector<Ptr> mChildren;

这不是“覆盖” - 你有 REDECLARED mChildren - 它与你的“抽象类”中的实例不同(它不是真正抽象的,但这是一个不同的故事) - 所以当你从基类中调用它时,你将从基类中获取成员,但是当你从派生类中调用它时,你将得到一个不同的成员 - 派生类中的成员。

另外 - 我不确定你是如何使用这段代码的,但是你的派生类不是派生的 - 它完全是一个不同的类:

试试这个:

class AbstractClass {

  public:

    typedef std::unique_ptr<AbstractClass> Ptr;
    void AddChild(Ptr child)

  protected:
   std::vector<Ptr> mChildren;

...

}

class Derived: public AbstractClass{...

不要在派生类中重新声明mChildren。当您在基类中将其声明为受保护时,它“存在”基类中,但可以从派生类访问相同的成员。这应该可以解决你的问题。

但是你需要阅读访问修饰符,抽象方法,虚方法和继承。任何体面的C ++书籍或在线教程都会让你了解这些东西。

答案 1 :(得分:2)

您无法覆盖C ++中的数据成员,只能覆盖虚函数。