gpt4 book ai didi

c++ - 在接口(interface)构造函数中调用重写的接口(interface)方法

转载 作者:行者123 更新时间:2023-11-28 05:18:40 26 4
gpt4 key购买 nike

我创建了一个名为“iDrawableObject”的接口(interface),其中包含对象的所有绘图相关方法/成员。

接口(interface)还包括虚拟方法,例如“装饰”,派生类可以在其中更改它们在屏幕上的显示方式。

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

我找到的替代方法是在派生类的构造函数中手动调用重写的“装饰”方法。然而,这对我来说似乎很糟糕,因为它很容易忘记,可以说这是一种额外的“依赖性”。

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

谢谢!

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;
}

最佳答案

我认为基本问题是派生类初始化了基类的成员。如果将 protected 成员设为私有(private),并强制派生类将适当的值传递给基类构造函数,它们将不得不正确地构造自己。

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

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

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

另外,在派生类中初始化一个基类成员,比如

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

无论如何都行不通。

关于c++ - 在接口(interface)构造函数中调用重写的接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41999819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com