【C++ Primer | 15】dynamic_cast

#include <iostream>
using namespace std;

class A {
public:
    virtual void display() { cout << "A::display()" << endl; }
};

class B : public A {
public:
    void display() { cout << "B::display()" << endl; }
};

int main()
{
    A a;
    B b;
    A* pa;
    B* pb;

    pa = &b;        //多态性
    pa->display();  //输出B::display()

    pb = (B*)pa;    //由于pa是指向B类对象的,所以这里可以这样写,但是不安全
    pb->display();  //输出B::display()

    //dynamic_cast必须用在使用了虚函数的类的继承层次中,否则编译出错
    pb = dynamic_cast<B*>(pa);  //注意括号不能少
    if (pb != nullptr)          //条件为真
        pb->display();          //输出B::display()

    pa = &a;
    pb = nullptr;
    pb = (B*)pa;        //如果不用dynamic_cast,这里的转换仍会发生,所以这种写法是错误的
    pb->display();      //输出A::display()

    pb = dynamic_cast<B*>(pa);  //由于pa指向A类对象,所以这里的转换不会成功,pb为nullptr
    if (pb != nullptr)          //条件为假
        pb->display();          //不执行
}

输出结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值