2015-03-13 158 views
0

我正在为cocos2d-x构建游戏,并且想要从父类调用子类方法。有什么办法可以从父类调用子方法吗?

class Parent { 
    *//do something 
    //How can i call method from subchild class here?* 
} 

class Child : Parent { 
    *//do something* 
} 

class SubChild : Child { 
    void functionToBeCalledFromParent(); 
} 
+4

有一个简单的方法:在'SubChild'中覆盖'Parent'中的虚函数。 – Deduplicator 2015-03-13 13:48:50

+0

有一个不太简单的方法:使用CRTP – Yakk 2015-03-13 13:53:23

回答

0

我建立一个游戏的cocos2d-x和想从父类调用子类方法

您可以1)声明函数在家长和孩子把它定义或2)在父项中定义它,并在子项中覆盖它(重新定义它)。

0

使用CRTP,你的例子,因为一旦它声明的类型名称是有效的

class Parent { 
    void callSubclassFunction() { 
     //How can i call method from subchild class here? 
    } 
} 

class Child : Parent { 
} 

class SubChild : Child { 
    void functionToBeCalledFromParent(); 
} 

会变成

#include <iostream> 

template <typename TSubclass> 
class Parent { 
public: 
    void callSubclassFunction() { 
     static_cast<TSubclass*>(this)->functionToBeCalledFromParent(); 
    } 
}; 

template <typename TSubclass> 
class Child : public Parent<TSubclass> { 
}; 

class SubChild : public Child<SubChild> { 
public: 
    void functionToBeCalledFromParent() { 
     std::cout << "SubChild!" << std::endl; 
    } 
}; 

int main() 
{ 
    SubChild child; 
    child.callSubclassFunction(); 
} 

Runnable at Coliru

传递SubChild作为模板参数Child<>作品,它就在继承列表除法器的前面。

使用static_castParent中“downcast”在这里完全是良性的。如果子类未定义在Parent中调用的函数,则编译将失败。

这种技术被称为静态编译时多态性,它是什么ATL和WTL都在建。 oppsosite,也许更传统的方法将是动态运行时多态性,这是你得到的虚拟功能。

+0

谢谢:)它为我工作:) – nullPointerException 2015-03-16 03:59:57

+0

随时upvote我的答案然后;-) – 2015-03-16 08:05:30

相关问题