继承类的组成

时间:2015-07-23 11:32:37

标签: c++ inheritance composition

可能已经有一个问题,但我无法找到它。

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

让我们说你有以下内容:

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。

有优雅的解决方案吗?

3 个答案:

答案 0 :(得分:0)

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

#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);
}

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

答案 1 :(得分:0)

模板是一个选项吗?

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

class FooChild : public FooBase<BarChild> {};

如果我使用intdouble来测试此功能,只需使用一个成员变量:http://ideone.com/nOfR5x

但它确实要求FooBase的声明后跟尖括号。

答案 2 :(得分:0)

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