我想说我在这里找到了解决这个问题的方法,但却找不到我想要的东西。我的问题可能有一个简单的解决方案。
所以请看这个例子:
class Component
{
public:
virtual ~Component() {} // Make Polymorphic;
void Update() {};
};
class UserMadeComponent : public Component
{
public:
void Update() {};
};
int main()
{
std::vector<Component*> _components;
UserMadeComponent* UsersComponent = new UserMadeComponent;
_components.push_back(UsersComponent);
while (true)
{
for (auto _comp = _components.begin(); _comp != _components.end(); _comp++)
{
(*_comp)->Update();
}
}
}
现在程序员使用这个框架可以创建他们想要的任何类型的组件。他们会将此添加到组件向量中。我希望能够获得组件的类型并调用其Update方法。这是我想要完成的一个小图:
所以我们的目标是打电话给父母&#34;更新方法。但是,用户可以创建他们喜欢的任何类型的组件。我不能假设这个数组中的任何组件的类型。我希望这是有道理的
// // EDIT
感谢大家帮助我理解虚拟方法调用。但是我怎么知道那个班级到底是什么。例如,用户创建了一个名为&#34; Transform&#34;的组件。我只想在组件数组中允许一个Transform实例。但显然如果我只知道它的组件指针,我就无法检查这种情况。
这很难解释,所以这是另一张图片:
答案 0 :(得分:2)
你正在倒退。而是创建一个名为do_update
的虚拟方法,派生类会覆盖该方法。父类的update
方法应调用虚拟do_update
方法,该方法将正确分派。
标准库就是这样做的......
答案 1 :(得分:2)
使用虚拟方法。
父:
virtual void Update();
如果你希望Component类是“纯虚拟”,意味着你必须将它子类化,它只是代表一个抽象/接口,你可以这样做:
virtual void Update() = 0;
如果您尝试实例化Component对象,则会出现错误,只创建实现所有纯虚方法的子类对象。
编辑:
以下代码检查x是否为Transform。但是,这样做意味着您可能存在设计缺陷。为什么不创建一个语义上知道的容器来阻止用户添加两个转换呢?
dynamic_cast<Transform*>(x) == nullptr