2013-04-07 149 views
3

我遇到了继承问题,我不知道我的解决方案是否优雅。我有这样的类覆盖类成员变量

class Var 
{ 
public: 
    virtual void doSomething(); 
} 
class DerivedVar : public Var 
{ 
public: 
    virtual void doSomething(); 
    void doSomethingElse(); 
} 

我也有MyDerived继承自MyBase。 MyBase有Var类型的成员,而MyDerived需要有DerivedVar的成员,因此可以调用doSomething()。目前,我使用模板来解决这个问题

template<typename VarType> 
class MyBase 
{ 
protected: 
    VarType var; 
public: 
    MyBase() { var.doSomething(); } 
} 

class MyDerived : public MyBase<DerivedVar> 
{ 
public: 
    MyDerived() : MyBase() { var.doSomethingElse(); } 

} 

我想知道是否有更好的方法来做到这一点(例如,而不需要使用模板)如果你希望或需要

+1

如果您不知道CRTP,您可能会发现有关CRTP的内容。 – chris 2013-04-07 17:17:39

+0

那么......如果你不需要在堆上添加一个间接和分配级别,你总是可以存储一个指针...... – StoryTeller 2013-04-07 17:20:34

回答

1

避免模​​板化,那么你需要动态地分配协变类型的数据成员。

然后一个好方法是将工厂传递给构造函数链(它可以是一个默认的构造函数参数),然后在基类中调用它。

ungood方法,但在90年代初非常流行,是使用两阶段初始化。

好吧,我预料到你还没有遇到的问题。

但是你会的。 ;-)

这就是说,如果你可以使模板方法的工作,这可能是最好的。

最直接的解决方案,最少量的解决方法以及代码和设计自适应。