Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以覆盖抽象基类的成员吗?_C++_Polymorphism - Fatal编程技术网

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{...