我有一个类层次结构,在一个基类中有很多共享成员函数,在两个派生类中也有大量独特的成员函数:
class Scene {
public:
void Display();
void CreateDefaultShapes();
void AddShape(Shape myShape);
// lots more shared member functions
}
Class AnimatedScene : public Scene {
public:
void SetupAnimation();
void ChangeAnimationSpeed(float x, float y);
// lots of member functions unique to animation
}
Class ControllableScene : public Scene {
public:
void ConfigureControls();
void MoveCamera(float x, float y, float z);
void Rotate(float x, float y, float z);
// lots of member functions unique to a controllable scene
}
毫不奇怪,这不起作用:
Scene myScene;
myScene.SetupAnimation();
这个问题的正确解决方案是什么?我是否应该将所有派生成员函数都虚拟化并将它们添加到基类中?调用 SetupAnimation()
时应该使用强制转换吗?有没有更聪明的设计可以解决这个问题?
注意:我从别处接收到 myScene
并且在实例化它时不能简单地将它声明为 AnimatedScene
。
编辑:我添加了几个成员函数来说明这一点。一小部分初始化函数绝对适合简单地使用 virtual
。
最佳答案
- 您可以转换它,最好使用
static_cast
。最不受欢迎的选择。如果你正在类型转换东西,这通常意味着你的设计需要更多的思考 - 如果您有一个特定的函数/类需要一个或另一个,请将输入声明为您需要的类型,这样可以更准确地传达函数或类的要求
- 如果函数需要通用,并且这些方法不需要任何输入,那么您可以在父类中定义一个虚方法,比如
init
,它在派生类中调用设置实例的正确方法。
关于C++ VaSTLy 不同的派生类 - 虚拟方法? Actor ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33599820/