【问题标题】:composition of Inherited classes继承类的组成
【发布时间】:2015-07-23 11:32:37
【问题描述】:

可能已经有关于此的问题,但我找不到。

我确定有一个简单的解决方案,但我看不到。

假设您有以下内容:

class FooBase
{
protected:
    BarBase myInstance;
}

class FooChild : public FooBase
{
protected:
    BarChild myInstance;
}

class BarChild : public BarBase
{
}

所以基本上,您想在 FooChild 类中使用 BarBase 的派生版本。

我认为在上面的代码中,将有 2 个不同的 myInstance 实例(一个 BarBase 和一个 BarChild)。

我希望只有一个实例,以便我可以在 FooBase 中使用 BarBase,并且我可以在 FooChild 中使用 BarChild。

有没有优雅的解决方案?

【问题讨论】:

    标签: c++ inheritance composition


    【解决方案1】:

    你可以尝试这样的事情,以便只创建一个实例。

    #include <iostream>
    
    class BarBase
    {
    }
    ;
    class BarChild : public BarBase
    {
    }
    ;
    
    class FooBase
    {
    public:
      FooBase(BarBase* baseBar);
    protected:
      BarBase* myInstance;
    }
    ;
    
    
    class FooChild : public FooBase
    {
    public:
      FooChild(BarBase* base)
    ;
    }
    ;
    
    
    FooBase::FooBase(BarBase* baseBar)
    {
      myInstance = baseBar;
    }
    
    FooChild::FooChild(BarBase* childBar) : FooBase(childBar)
    {
    
    }
    
    int main()
    {
      BarChild *bc = new BarChild();
      FooChild fc(bc);
    }
    

    我不知道这是正确的解决方案还是优雅的解决方案;)

    【讨论】:

    • 但是你在 FooChild 中得到的 myInstance 是 BarBase。
    【解决方案2】:

    模板是一种选择吗?

    tempalate <typename T = BarBase>
    class FooBase{
    protected:
        T myInstance;
    };
    
    class FooChild : public FooBase<BarChild> {};
    

    如果我使用intdouble 仅使用一个成员变量来测试它是否可以正常工作:http://ideone.com/nOfR5x

    不过,它确实要求声明 FooBase 后跟尖括号。

    【讨论】:

      【解决方案3】:

      我相信虚拟化是您正在寻找的。给它看看。您可以简单地使用创建这些变量的构造方法。如果您创建派生类,那么它会调用该类的构造函数,该构造函数会创建该变量。

      【讨论】:

      • 至少有一个 look 的链接可能会有所帮助,你有什么建议,维基百科在其 C++ 文章中有一个 Dynamic polymorhism 部分。
      猜你喜欢
      • 2019-03-23
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2019-02-08
      • 2013-12-22
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      相关资源
      最近更新 更多