0

我想实现我在 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();
     }
}

结果应该是应该通过Base调用Object的Update()。我是 100% 上面的代码不起作用,这就是为什么我需要一些想法。

4

3 回答 3

5

C++ 没有接口。您使用纯虚方法创建一个抽象类。

class MonoBehaviour 
{
    virtual void Update() = 0;
};

class your_class : MonoBehaviour 
{
    void Update() 
    { 
        // implement here. 
    }
};
于 2013-01-06T20:05:51.397 回答
0

可能存在子类方法和基类方法的签名不相同,即它们具有相同的名称但返回不同的东西或具有不同的参数。这是始终调用基类方法的一种方法。

或者您可能只是在主函数中构造基类对象而不是子类对象。在 main 函数中放置一个中断来检查您正在为其调用 Update 的对象的实际类型。

您发布的代码应该可以正常工作。基类是否是抽象的并不重要。我更喜欢使其具体化并在应该为 = 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()
于 2013-01-06T23:32:12.270 回答
0

第一件事。您提供的示例首先不起作用,因为您忘记了指针的实例化。你的意思可能是这样的:

 Base* base = new Object;
 while(1)
 {
    base->Update();
 }

现在解决这个问题。这个概念应该如您所愿。如果如其他人已经指出的那样,Update 覆盖了 base 中的虚函数,则应在 Object 类中调用 Update。有一个整洁的东西c++11被调用override。它是您在函数声明之后放置的关键字,您希望覆盖基中的某些虚函数。override如果您尝试override使用非虚拟函数,编译器会抱怨这是一个很好的做法。这减少了代码中出错的可能性。

于 2015-12-27T13:12:07.240 回答