我想实现我在C ++项目中的引擎(Unity3D)中看到的行为。
以下代码使用C#(Unity的语言):
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update() {
//Update is called every frame
}
}
由于我无法访问MonoBehavior源,我只能猜测Update()是一个可以像这样实现的虚函数。
我想在C ++中复制相同的行为。在main()
中有一个循环,超级对象将在该循环中调用它的Update()
方法,并且它的所有子节点都应该继承这个超级对象,并且有可能实现Update()
并使用它。
我知道这是一个含糊不清的问题,但我到处寻找答案而没有找到答案。
以下是一个例子:
class Base
{
public:
virtual void Update();
};
class Object: public Base
{
public:
void Update();
};
void main()
{
Base* base;
while(1)
{
base->Update();
}
}
结果应该是Object的Update()应该通过Base调用。我100%上面的代码不起作用,这就是为什么我需要一些想法。
答案 0 :(得分:5)
C ++没有接口。使用纯虚方法创建抽象类。
class MonoBehaviour
{
virtual void Update() = 0;
};
class your_class : MonoBehaviour
{
void Update()
{
// implement here.
}
};
答案 1 :(得分:0)
可能存在子类方法的签名和基类方法不相同,即它们具有相同的名称但返回不同的东西或具有不同的参数。这是始终调用基类方法的一种方法。
或者你可能只是在main函数中构造基类对象而不是子类对象。在main函数中中断以检查您调用Update for的对象的实际类型。
您发布的代码应该可以正常运行。基类是否抽象无关紧要。为了在实现子类时的简单性,我更喜欢使它具体并在应该为0的方法中抛出异常(我不必从一开始就实现完整的行为,只是我关注的方法和我正在测试;所以它逐渐增加。)
是的,坚持公共继承。
编辑: 或者,如果您有类似的内容,可能会涉及对象切片:
Derived* d_ptr = new Derived();
Base b = *d_ptr; // object slicing, d's methods will become Base methods;
Base* b_ptr = &b;
b_ptr->Update(); // will call Base::Update()
答案 2 :(得分:0)
首先要做的事情。您提供的示例将首先无法工作,因为您忘记了指针的实例化。你可能意味着这样的事情:
Base* base = new Object;
while(1)
{
base->Update();
}
现在开始了。这个概念应该按照您的预期运作。如果Update覆盖了其他人已经指出的基本虚函数,则应在Object类中调用Update。 c++11
中有一个称为override
的简洁内容。它是在您希望覆盖基类中的某个虚函数的函数声明之后放置的关键字。使用override
是一种很好的做法,因为如果您尝试override
非虚函数,编译器会抱怨。这减少了代码中出错的可能性。