抱歉,标题含糊。

我正在编写一组类,但是我很难想到一种直观的方法来分解在基本构造函数中完成的操作以及在派生构造函数中完成的操作。

我的问题如下:

所有类(class)都要求按顺序完成步骤A,C和E。因此,将它们放在基本构造函数中是有意义的。

步骤B和D对于每个派生类都是唯一的。

不幸的是,B必须在A之后,C之前完成,并且类似地D必须在C之后和E之前完成。这是OpenGL函数调用,而我受其约束。

我最初尝试了类似的方法,希望在基类中尽可能地封装:

public class MyBase
{
    MyBase()
    {
        A():
        B();
        C();
        D();
        E();
    }
    void A() {...}
    void C() {...}
    void E() {...}
    virtual void B() = 0;
    virtual void D() = 0;
}

public class MyDerived : public MyBase
{
    MyDerived() : MyBase() {}
    void B() {...}
    void D() {...}
}

但这在C++中是不可能的...

除了以下以外,是否还有更直观的方法:
public class MyBase
{
    MyBase() {}
    void A() {...}
    void B() {...}
    void C() {...}
}

public class MyDerived : public MyBase
{
    MyDerived()
    {
        A():
        B();
        C();
        D();
        E();
    }
    void B() {...}
    void D() {...}
}

我希望尽可能避免重复代码。

有任何想法吗?

最佳答案

如果您确实想在构造函数中调用它,并且不满意以后再调用它,则可以通过执行以下操作来减少困惑。

public class MyBase
{
    protected:
    void templateMethod()
    {
        A():
        B();
        C();
        D();
        E();
    }
    private:
    void A() {...}
    void C() {...}
    void E() {...}
    virtual void B() = 0;
    virtual void D() = 0;
};

public class MyDerived : public MyBase
{
    MyDerived() : MyBase() {templateMethod();}
    void B() {...}
    void D() {...}
};

但是,这并不是一个真正的模板方法模式,因为现在所有派生类都必须调用它,而不是为基类调用一次。

关于c++ - 基类和派生类构造函数多态性困扰,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14970915/

10-12 16:48
查看更多