基类和派生类构造函数多态性问题

Base and Derived class constructor polymorphism woes

本文关键字:多态性 问题 构造函数 派生 基类      更新时间:2023-10-16

很抱歉标题含糊不清。

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

我的问题如下:

所有类都要求按顺序完成步骤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() {...}
};

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

既然在构造函数中调用虚拟函数可能很危险,那么使用宏是一个可以接受的解决方案吗?

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