Base和Derived类构造函数多态性困境

时间:2013-02-20 01:46:30

标签: c++ inheritance polymorphism

对于模糊的标题感到抱歉。

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

我的问题如下:

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

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

不幸的是,B必须在之后 之后 C 之前完成,并且之后 / em> 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() {...}
}

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

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果你肯定想在构造函数中调用它,并且之后调用它就不行了,你可以通过执行以下操作来减少混乱。

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() {...}
};

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

答案 1 :(得分:0)

鉴于在构造函数中调用虚函数可能很危险,使用宏是一个可接受的解决方案吗?

#define MY_BASE_INIT A();B();C();D();E();

public class MyBase
{
    MyBase() {}
    void A() {...}
    void C() {...}
    void E() {...}
}

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