“但是有什么方法可以将其转换回来:从父级(从子级获得),将子级返回给子级吗?”
是的,正如其他答案中提到的,有两种方法可以做到这一点。
Child * old_child = dynamic_cast<Child*>(parent);
结果dynamic_cast<> http://en.cppreference.com/w/cpp/language/dynamic_cast可以在运行时检查,因此您可以确定是否parent
对象实际上代表一个Child
实例:
if(!old_child) {
// parent is not a Child instance
}
另请注意,要使其正常工作,相关类需要有一个 vtable,RTTI 可以实际确定它们的关系。实现这一目标的最简单形式是给出Parent
类的虚析构函数
class Parent {
public:
virtual ~Parent() {}
// or
// virtual ~Parent() = default;
// as suggested for latest standards
};
NOTE:
如果这适用于一般设计决策,我会强烈忽略它。使用纯虚拟接口 https://stackoverflow.com/questions/318064/how-do-you-declare-an-interface-in-c相反,这些都保证会被实施,或者不会被实施。
第二种方式static_cast<> http://en.cppreference.com/w/cpp/language/static_cast可以在您熟知的环境中使用parent
其实是个孩子。最简单的形式是CRTP http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern, where Parent
将继承类作为模板参数
template <class Derived>
class Parent {
void someFunc() {
static_cast<Derived*>(this)->doSomething();
}
};
class Child : public Parent<Child> {
public:
void doSomething();
};
实例化的有效性Parent<>
and static_cast<>
将在编译时进行检查。
NOTE:
另一个优点是您可以使用派生接口,该接口利用
- 静态类成员
Derived
-
typedef
提供者:Derived
- ...更多类特征,可以在编译时检查