C++ - 在父类中定义子类

标签 c++ inheritance parent-child

在处理个人项目时,我发现自己处于一种情况,我想为我的抽象父类的子类创建可重用的代码块,这些子类可以实现其中的一些纯虚拟方法。为此,我创建了一个在主要子类之后继承的中间父类。但是,由于项目中最终子类的性质,除了子类之外的任何对象都可以访问中间父类是没有意义的。因此,我创建了这种类型的类结构:

class Foo
{
protected:
    class Bar : protected Foo
    {
    public:
        void a()
        {
            //implementation of a()
        }
    };

public:
    virtual void a() = 0;
    virtual void b() = 0;
};

class Beep : public Foo, private Foo::Bar
{
    void b()
    {
        //implementation of b()
    }
};

(我知道菱形继承(钻石问题)问题和其他通过多个来源从祖先类继承引起的问题。为了这个问题的目的,请假设它不是问题,因为它不是重点。)

在尝试将 Foo 定义为 Bar 的父项时,上述代码会导致“不允许不完整的类型”错误。有没有一种方法可以重构代码以消除错误,同时保持所需的类/可访问性结构?

虽然我对如何实现我所描述的内容很感兴趣(此时主要是出于好奇),但我会接受替代解决方案,只要它们导致匹配的行为,即:代码实现抽象基础的部分类仅对在所述基类之后继承的对象可见/可访问。

最佳答案

您可以转发声明Bar并在Foo之后定义它。

class Foo
{
protected:
    class Bar;

public:
    virtual void a() = 0;
    virtual void b() = 0;
};

class Foo::Bar : protected Foo
{
public:
    void a()
    {
        //implementation of a()
    }
};

关于C++ - 在父类中定义子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49471421/

相关文章:

java - 继承返回空值

c++ - 我希望我的继承类具有相同的构造函数

java - 如何使用 Java API 在 Rally 中检查文件夹之间的关系

c++ - 颜色在启动示例 opengl 中不起作用

C++ 开关与成员函数指针与虚拟继承

c++ - 如何初始化 int *const *const?

javascript - Jquery - 尝试在 div 中选择图像

java - 如何更改JDO中对象的父对象?

c++ - 我的对象不会同时旋转和缩放

c++ - 相同的 C++ 代码有时有效,有时无效