在接口构造函数中调用重写的接口方法

时间:2017-02-02 10:32:06

标签: c++ inheritance

我创建了一个名为' iDrawableObject'包含对象的所有绘图相关方法/成员。

界面还包括虚拟方法,例如'装饰'其中派生类可以改变它们在屏幕上的显示方式。

我在iDrawableObject接口的构造函数中调用了decorate方法,但是,正如预测的那样,它不会调用重写方法。 这是因为接口的构造函数在派生类的构造函数之前运行,因此该方法尚未被覆盖。

我发现这种困境的替代方法是手动调用被覆盖的装饰'派生类的构造函数中的方法。然而,这对我来说似乎很糟糕,因为它很容易被遗忘,而且它是一种附加的依赖性'可以这么说。

我的问题是:被覆盖的“装饰”的最佳方式是什么?调用派生类的方法,而不强制实现者在每个派生类的构造函数中手动调用它(可以安全地假设所有使用该接口的类都需要调用自己的decorate实现)。

谢谢!

class iDrawableObject {

    public:

    iDrawableObject() 
    {
        registerWithGameEngine(this);
        decorate();
    }

    ~iDrawableObject()
    {

    }

    void draw()
    {
        ... // Draws it on screen
    }
    virtual void decorate() 
    {
        renderGraphic = SquareGraphic(...);
    }

    protected:

    Graphic renderGraphic;
    Vector2f positionOnScreen;

};

class Circle 
    :
    public iDrawableObject;
{
    public:

    Circle(Vector2f _pos)
        :
        positionOnScreen(_pos)
    {       
    }

    void decorate() override
    {
        renderGraphic = CircleGraphic(...);
    }

};

int main() {

    Circle c = Circle(Vector2f(0.0f, 0.0f);

    c.draw();           // A Square is drawn on screen
    c.decorate();       // Now calls the overriden method
    c.draw()                // A Circle is drawn on screen

    return 0;
}

1 个答案:

答案 0 :(得分:1)

我认为基本问题是你有派生类初始化基类的成员。如果将受保护的成员设为私有,并强制派生类将适当的值传递给基类构造函数,则必须正确构造它们。

如果唯一的基类构造函数是

iDrawableObject(Graphic rG, Vector2f pos)
   : renderGraphic(rG), positionOnScreen(pos)
{ }

派生类必须提供所需的信息。

此外,在派生类中初始化基类成员,如

Circle(Vector2f _pos)
    :
    positionOnScreen(_pos)   // member of iDrawableObject
{       
}

无论如何都不起作用。