C++ 我可以覆盖抽象基类的成员吗?
我不确定这个问题的措辞是否正确,所以我将从一些代码开始。这不是从我的程序,但希望它足以让大家了解这个概念C++ 我可以覆盖抽象基类的成员吗?,c++,polymorphism,C++,Polymorphism,我不确定这个问题的措辞是否正确,所以我将从一些代码开始。这不是从我的程序,但希望它足以让大家了解这个概念 class AbstractClass { public: typedef std::unique_ptr<AbstractClass> Ptr; std::vector<Ptr> mChildren; void AddChild(Ptr child); void Render(); } class Derived { publ
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();
}
方法也是。问题是,我的渲染方法工作得很好,这意味着McChildren不是空的。似乎无法从派生类中正确查看集合。我敢肯定,这可能主要是因为没有正确封装孩子们的问题,但我很难解决这个问题
让McChildren成为私人会员会有帮助吗?我只是尝试让mChildren是私有的,并创建一个返回向量指针的getter,但是VS不允许我的派生类的getter返回指向派生类向量的指针
总而言之-我需要能够访问集合,因为它都是AbstractClass::Ptr的集合,但我需要能够使用更多方法将派生的::Ptr修改为派生对象。您的代码有几个问题-我无法全部讨论(现在没有时间)-但是:
派生类{
公众:
....
性病:病媒儿童;
这不是一个“覆盖”-您已经重新声明了McChildren-它与您的“抽象类”中的实例不同(它不是真正的抽象,但这是一个不同的故事)-因此,当您从基类调用它时,您将从基类中获取成员,但当您从派生类调用它时,您将获取另一个成员-派生类中的成员
另外-我不确定您是如何使用此代码的,但您的派生类不是派生的-它是一个完全不同的类:
试试这个:
class AbstractClass {
public:
typedef std::unique_ptr<AbstractClass> Ptr;
void AddChild(Ptr child)
protected:
std::vector<Ptr> mChildren;
...
}
class Derived: public AbstractClass{...
class抽象类{
公众:
typedef std::unique_ptr ptr;
void AddChild(Ptr child)
受保护的:
性病:病媒儿童;
...
}
派生类:公共抽象类{。。。
不要在派生类中重新声明mChildren。当您在基类中将其声明为受保护时,它“存在”在基类中,但可以从派生类访问同一成员。这应该可以解决您的问题
但是你需要阅读Access修饰符、抽象方法、虚拟方法和继承。任何合适的C++书籍或在线教程都会让你运行并运行这些东西。
< p>你的代码有几个问题-我不能全部进入(现在没有时间)-但是:派生类{
公众:
....
性病:病媒儿童;
这不是一个“覆盖”-您已经重新声明了McChildren-它与您的“抽象类”中的实例不同(它不是真正的抽象,但这是一个不同的故事)-因此,当您从基类调用它时,您将从基类中获取成员,但当您从派生类调用它时,您将获取另一个成员-派生类中的成员
另外-我不确定您是如何使用此代码的,但您的派生类不是派生的-它是一个完全不同的类:
试试这个:
class AbstractClass {
public:
typedef std::unique_ptr<AbstractClass> Ptr;
void AddChild(Ptr child)
protected:
std::vector<Ptr> mChildren;
...
}
class Derived: public AbstractClass{...
class抽象类{
公众:
typedef std::unique_ptr ptr;
void AddChild(Ptr child)
受保护的:
性病:病媒儿童;
...
}
派生类:公共抽象类{。。。
不要在派生类中重新声明mChildren。当您在基类中将其声明为受保护时,它“存在”在基类中,但可以从派生类访问同一成员。这应该可以解决您的问题
<>但是你需要阅读Access修饰符、抽象方法、虚拟方法和继承。任何一本体面的C++书籍或在线教程都会让你运行并运行这些东西。 < P>你不能重写C++中的数据成员,只不过是虚拟函数。 < P>你不能重写C++中的数据成员,只有虚拟函数。只需使用一个m_子类,然后从派生类中删除“std::vector mChildren;”。(另外,您的类不是实际派生的)。如果您的意图是只使用一个m_子类,则从派生类中删除“std::vector mChildren;”。(另外,您的类不是实际派生的)+1是真的。我没有提到它,因为我认为OP只是意味着在派生类中使用基类的成员。正如我提到的,而且我相信你知道,问题中几乎所有的代码都是错误的。+1是真的。我没有提到它,因为我认为OP只是意味着在派生类中使用基类的成员。正如我所说的我相信你知道,问题中的所有代码都是错误的。对不起,我键入了这段代码,没有从我的程序中复制。我的派生类确实继承了我的抽象基类。我的问题是,我的基类不支持派生类需要支持的所有方法。派生类应该包含我是派生类的成员,但也应该能够执行基类中的基本功能。这是一个难题。例如:想象一个Bodypart基类。骨骼、腕部和头部都需要Render()。但是,骨骼可以有子Bodyparts,腕部可以有骨骼,等等。@user1781726-然后声明Render()在基本虚拟类中,执行所有类的通用操作,然后在派生类中重写它以执行其他操作。有关完整的教程,请参见-。抱歉,我键入了此代码,并没有从程序中复制它。我的派生类继承自抽象基类。我的问题是,我的基类不支持所有方法派生类需要支持的。派生类应该包含派生类的成员,但也应该能够执行基类中的基本函数。这是一个难题。例如:想象一个Bodypart基类。骨骼、腕部和头部都需要渲染()。但是,骨骼可以有子身体部位,手腕可以有骨骼,等等。@user1781726-然后在基本虚拟中声明render(),并在那里执行所有类的通用操作,然后在派生类中重写它以执行以下操作:
class AbstractClass {
public:
typedef std::unique_ptr<AbstractClass> Ptr;
void AddChild(Ptr child)
protected:
std::vector<Ptr> mChildren;
...
}
class Derived: public AbstractClass{...