我正在为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();
}
答案 0 :(得分:0)
我正在为cocos2d-x构建游戏,并希望从父类调用子类方法
您可以1)声明函数在父级中并在子级中定义它或2)在父级中定义它并在子级中覆盖它(重新定义它)。
答案 1 :(得分: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();
}
将SubChild
作为模板参数传递给Child<>
是有效的,因为typename在声明后很快就会生效,它就在继承列表分隔符:
的前面。
在static_cast
中使用Parent
“向下转换”是非常温和的。如果子类没有定义Parent
中调用的函数,则编译将失败。
这种技术称为静态或编译时多态,它就是ATL和WTL的基础。 oppsosite和更传统的方法可能是动态或运行时多态,它就是你用虚函数得到的。