用C++实现一个接口

本文关键字:一个 接口 C++ 实现 | 更新日期: 2023-09-27 17:50:53

我想实现我在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%以上的代码不起作用,这就是为什么我需要一些想法。

用C++实现一个接口

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

class MonoBehaviour 
{
    virtual void Update() = 0;
};
class your_class : MonoBehaviour 
{
    void Update() 
    { 
        // implement here. 
    }
};

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

或者,您可能只是在主函数中构造基类对象,而不是子类对象。在主函数中插入一个break,以检查调用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()

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

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

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