C# 在C+中实现一个接口+;? 我想在C++项目中实现一个引擎(UNITY3D)中看到的行为。
以下代码使用C#(Unity的语言): 由于我无法访问MonoBehavior源代码,我只能猜测Update()是一个可以像这样实现的虚拟函数 <>我想在C++中复制相同的行为。在C# 在C+中实现一个接口+;? 我想在C++项目中实现一个引擎(UNITY3D)中看到的行为。,c#,c++,inheritance,interface,polymorphism,C#,C++,Inheritance,Interface,Polymorphism,以下代码使用C#(Unity的语言): 由于我无法访问MonoBehavior源代码,我只能猜测Update()是一个可以像这样实现的虚拟函数 我想在C++中复制相同的行为。在main()中有一个循环,超级对象将在该循环中调用它的Update()方法,它的所有子对象都应该继承这个超级对象,并有可能实现Update()并使用它 我知道这是一个模棱两可的问题,但我到处都在寻找答案,却没有找到答案 以下是一个例子: class Base { public: virtual void Upd
main()
中有一个循环,超级对象将在该循环中调用它的Update()
方法,它的所有子对象都应该继承这个超级对象,并有可能实现Update()
并使用它
我知道这是一个模棱两可的问题,但我到处都在寻找答案,却没有找到答案
以下是一个例子:
class Base
{
public:
virtual void Update();
};
class Object: public Base
{
public:
void Update();
};
void main()
{
Base* base;
while(1)
{
base->Update();
}
}
结果应该是对象的Update()应该通过Base调用。我100%相信上面的代码不起作用,这就是为什么我需要一些想法。C++没有接口。使用纯虚方法创建抽象类
class MonoBehaviour
{
virtual void Update() = 0;
};
class your_class : MonoBehaviour
{
void Update()
{
// implement here.
}
};
C++没有接口。使用纯虚方法创建抽象类
class MonoBehaviour
{
virtual void Update() = 0;
};
class your_class : MonoBehaviour
{
void Update()
{
// implement here.
}
};
可能存在子类方法和基类方法的签名不相同的情况,即它们具有相同的名称,但返回不同的内容或具有不同的参数。这是始终调用基类方法的一种方法 或者,您可能只是在主函数中构造基类对象,而不是子类对象。在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()
可能存在子类方法和基类方法的签名不相同的情况,即它们具有相同的名称,但返回不同的内容或具有不同的参数。这是始终调用基类方法的一种方法 或者,您可能只是在主函数中构造基类对象,而不是子类对象。在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()
第一件事。您提供的示例首先不起作用,因为您忘记了指针的实例化。你可能是这样说的:
Base* base = new Object;
while(1)
{
base->Update();
}
现在把这件事放一边。这个概念应该如您所期望的那样工作。如果Update覆盖了base中的虚拟函数,则应该在对象类中调用Update,其他人已经指出了这一点。在
c++11
中有一个整洁的东西叫做override
。它是一个关键字,放在函数声明之后,您希望覆盖基中的某个虚拟函数。最好使用重写
,因为如果您尝试重写
非虚函数,编译器会抱怨。这减少了代码中出现错误的可能性。首先要做的事。您提供的示例首先不起作用,因为您忘记了指针的实例化。你可能是这样说的:
Base* base = new Object;
while(1)
{
base->Update();
}
现在把这件事放一边。这个概念应该如您所期望的那样工作。如果Update覆盖了base中的虚拟函数,则应该在对象类中调用Update,其他人已经指出了这一点。在
c++11
中有一个整洁的东西叫做override
。它是一个关键字,放在函数声明之后,您希望覆盖基中的某个虚拟函数。最好使用重写
,因为如果您尝试重写
非虚函数,编译器会抱怨。这减少了代码中出现错误的可能性。是的,这是不明确的。我不明白。有更完整的例子吗?Unity似乎对方法名使用反射和约定来查找类实现的方法。我不确定你是否可以在C++中复制这个。你确定你想要这个,或者实际上是问如何创建一个虚拟方法并在C++中重写它?我正在处理一个项目,它有很多需要Update()的对象,以及它的ATM的方式,通过继承和虚拟化将更新更新到对象。我希望能创造出一种更通用的方法,比如Unity,但我发现它相当复杂。是的,它是模棱两可的。我不明白。有更完整的例子吗?Unity似乎对方法名使用反射和约定来查找类实现的方法。我不确定你是否可以在C++中复制这个。你确定你想要这个,或者实际上是问如何创建一个虚拟方法并在C++中重写它?我正在处理一个项目,它有很多需要Update()的对象,以及它的ATM的方式,通过继承和虚拟化将更新更新到对象。我希望能够创造一种更通用的方法,比如Unity,但我发现它相当复杂,Unity不是这样做的。抽象类没有派生的虚拟方法