3

我遇到了继承问题,我不知道我的解决方案是否优雅。我有这样的课

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

我也有继承自 MyBase 的 MyDerived。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(); }

}

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

4

1 回答 1

1

如果您想要或需要避免模板化,那么您需要动态分配协变类型数据成员。

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

一种不好的方法,但在 1990 年代初期非常流行,是使用两阶段初始化。

好的,我预计您尚未遇到的问题。

但是你将。;-)

也就是说,如果您可以使模板方法起作用,那可能是最好的。

最直接的解决方案,最少的变通方法以及代码和设计调整。

于 2013-04-07T17:31:20.650 回答