使用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_cast
在Parent
中“downcast”在这里完全是良性的。如果子类未定义在Parent
中调用的函数,则编译将失败。
这种技术被称为静态或编译时多态性,它是什么ATL和WTL都在建。 oppsosite,也许更传统的方法将是动态或运行时多态性,这是你得到的虚拟功能。
有一个简单的方法:在'SubChild'中覆盖'Parent'中的虚函数。 – Deduplicator 2015-03-13 13:48:50
有一个不太简单的方法:使用CRTP – Yakk 2015-03-13 13:53:23