C++ 科目二 [dynamic_cast]

文章目录

pre

class Base {
public:
    virtual void f1()
    {
        cout << "Base::f1()" << endl;
    }
    virtual void f2()
    {
        cout << "Base::f2()" << endl;
    }
};

class Derive : public Base {
public:
    virtual void f1()
    {
        cout << "Derive::f1()" << endl;
    }
    virtual void f2()
    {
        cout << "Derive::f2()" << endl;
    }
};

指针

// 当()中的指针指向的是子类空间时,则转型是安全的
Base *pbase1 = new Derive();
Derive *pderive1 = dynamic_cast<Derive *>(pbase1);    // down-cast
pderive1->f1();                                       // Derive::f()
Derive &pderive11 = dynamic_cast<Derive &>(*pbase1);  // down-cast
pderive11.f1();                                       // Derive::f()

// 当()中的指针指向的是父类空间时,则转型是不安全的
// 返回值是 nullptr
Base *pbase2 = new Base();
Derive *pderive2 = dynamic_cast<Derive *>(pbase2);  // up-cast

if (pderive2 != nullptr) {
    pderive2->f1();
    pderive2->f2();
} else {
    cout << "pderive2 == nullptr" << endl;
}

// terminate called after throwing an instance of 'std::bad_cast'
Derive &pderive22 = dynamic_cast<Derive &>(*pbase2);  // up-cast
try {
    pderive22.f1();
    pderive22.f2();
} catch (exception &e) {
    cout << "pderive22 == nullptr" << endl;
}

delete pbase1;
delete pbase2;

对象

// 当()中的指针指向的是 子类对象时,则转型是安全的
Derive pbase1;
Derive &pderive1 = dynamic_cast<Derive &>(pbase1);  // down-cast
pderive1.f1();                                      // Derive::f()

Derive *pderive11 = dynamic_cast<Derive *>(&pbase1);  // down-cast
pderive11->f1();                                      // Derive::f()

// 当()中的指针指向的是 父类对象时,则转型是不安全的
// terminate called after throwing an instance of 'std::bad_cast'
Base pbase2;
Derive &pderive2 = dynamic_cast<Derive &>(pbase2);    // up-cast
Derive *pderive22 = dynamic_cast<Derive *>(&pbase2);  // up-cast
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值