C++ 多态性:从父类到子类[重复]

2024-04-01

在C++中,我们可以将子类指针转换为父类,但是有没有办法将其转换回来:从父类(从子类获得)返回子类?

I mean:

class Parent
{
    ...
};

class Child : public Parent
{
    ...
};

int main(int argc, char const *argv[])
{
    Child* child = new Child();
    Parent* parent = child;
    Child* old_child = parent; // how to do this??
    return 0;
}

谢谢您的回答。


“但是有什么方法可以将其转换回来:从父级(从子级获得),将子级返回给子级吗?”

是的,正如其他答案中提到的,有两种方法可以做到这一点。

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
  • ...更多类特征,可以在编译时检查
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 多态性:从父类到子类[重复] 的相关文章

随机推荐