用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++没有接口。您使用纯虚拟方法创建了一个抽象类。
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
作为非虚拟函数,编译器会抱怨。这减少了代码中出现错误的可能性。