Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C+中实现一个接口+;? 我想在C++项目中实现一个引擎(UNITY3D)中看到的行为。_C#_C++_Inheritance_Interface_Polymorphism - Fatal编程技术网

C# 在C+中实现一个接口+;? 我想在C++项目中实现一个引擎(UNITY3D)中看到的行为。

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

以下代码使用C#(Unity的语言):

由于我无法访问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();
     }
}

结果应该是对象的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不是这样做的。抽象类没有派生的虚拟方法