可能已经有一个问题,但我无法找到它。
我确定有一个简单的解决方案,但我无法看到它。
让我们说你有以下内容:
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。
有优雅的解决方案吗?
答案 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> {};
如果我使用int
和double
来测试此功能,只需使用一个成员变量:http://ideone.com/nOfR5x
但它确实要求FooBase
的声明后跟尖括号。
答案 2 :(得分:0)
我相信虚拟化是你正在寻找的。看看吧。您可以简单地使用构造方法来创建这些变量。如果创建派生类,则它会调用该类的构造函数,该构造函数将创建该变量。