C++,找到父级并调用它的方法?
Posted
技术标签:
【中文标题】C++,找到父级并调用它的方法?【英文标题】:C++, finding parent and calling it's method? 【发布时间】:2017-08-30 22:20:15 【问题描述】:我想说的是,我已经在这里寻找解决此问题的方法,但只是找不到我想要的东西。我的问题可能有一个简单的解决方案。
举个例子:
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 方法。这是我想要完成的小图:
所以目标是调用“父母”更新方法。但是,用户可以创建他们想要的任何类型的组件。我不能假设这个数组中任何组件的类型。我希望这是有道理的
//编辑//
感谢人们帮助我理解虚拟方法调用。但是我怎么知道那个类实际上是什么。例如,用户创建了一个名为“Transform”的组件。我只想在组件数组中允许一个 Transform 实例。但是很明显,如果我只知道它是一个组件指针,我就无法检查这种情况。
很难解释,所以这里是另一张图片:
Link to image
【问题讨论】:
这里的虚函数怎么不适合你?另外,为什么下划线前缀?请不要那样做。 你不是已经调用了父级的更新“方法”吗? 【参考方案1】:你在倒退。相反,创建一个名为do_update
的虚拟方法,您的派生类将覆盖该方法。父类的update
方法应该调用虚拟的do_update
方法,它会正确调度。
这就是标准库的工作方式...
【讨论】:
"这就是标准库的做法。" - 在哪里? 他根本没有倒退。从字面上看,这正是子类化的用途。 @Josh 鉴于问题不够明确,这很可能是正确的方法,因为它是您的方法。 他解释了预期的接口,以及他的实现示例代码以及如何在他的 main.js 中使用它。怎么不清楚? @Josh 像这样:“所以目标是调用“父母”更新方法”【参考方案2】:使用虚方法。
家长:
virtual void Update();
如果您希望 Component 类是“纯虚拟的”,这意味着您必须对它进行子类化并且它只代表一个抽象/接口,您可以这样做:
virtual void Update() = 0;
如果你试图实例化一个组件对象,这将给你一个错误,你创建的子类对象只实现了所有纯虚方法。
编辑:
下面的代码检查 x 是否是一个变换。但是,这样做意味着您可能存在设计缺陷。为什么不制作一个语义感知容器来阻止用户添加两个转换呢?
dynamic_cast<Transform*>(x) == nullptr
【讨论】:
我现在有这个,它工作正常。但是我如何获得该类的类型,就像它被创建的那样。我已经延长了我的帖子 嗨@ReeceWard,通常你应该一次问一个问题。如果您还有其他问题,您应该标记一个正确答案并打开另一个问题。以上是关于C++,找到父级并调用它的方法?的主要内容,如果未能解决你的问题,请参考以下文章