我不确定我是否正确地写了这个问题,所以我将从一些代码开始。这不是来自我的计划,但希望它足以让我们了解这个概念。
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对象。
答案 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 ++中的数据成员,只能覆盖虚函数。