加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何使用非多态基类进行向下转换

发布时间:2020-12-16 07:22:06 所属栏目:百科 来源:网络整理
导读:在C中,没有使我的析构函数虚拟是否仍然可以向下转换我的非多态基类的指针/引用? 解决方法 虚拟析构函数与向下转换几乎没有关系.使析构函数成为虚拟的目的是允许通过指向base的安全删除. Base * ptr = new Derived;delete ptr; // undefined behavior if Bas
在C中,没有使我的析构函数虚拟是否仍然可以向下转换我的非多态基类的指针/引用?

解决方法

虚拟析构函数与向下转换几乎没有关系.使析构函数成为虚拟的目的是允许通过指向base的安全删除.

Base * ptr = new Derived;
delete ptr; // undefined behavior if Base destructor isn't virtual

可以使用static_cast执行向下转发,由您自己负责

void processBase(Base * ptr)
{
    // undefined behavior if ptr does not point to Derived
    // object or some object that inherits from Derived
    Derived * derived = static_cast<Derived *>(ptr);
}

还有dynamic_cast将检查向下转换是否合法,但它要求转换表达点(或引用)指向多态对象(即,至少有一个虚拟函数声明或继承的对象).

5.2.7.6 Otherwise,v shall be a pointer to or an lvalue of a polymorphic type (10.3)

如果转换表达式的类型不是多态的,则程序将无法编译.

总结一下 – 使析构函数虚拟化将使您的类具有多态性,但同样将通过声明任何其他虚拟成员函数来实现.要使用dynamic_cast,您需要一个多态类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读