C++类型转换 dynamic_cast

#include<iostream>

class Father {
public:
    virtual void Print(){
        printf("this is Father\n");
    }
    int m_age=10;
};

class Son:public Father{
public:
    virtual void Print () override{
        printf("this is Son\n");
    }
    std::string m_name = "Son";

};

//总结来说 
//dynamic_cast就是避免了new父类对象 但是却将父类指针强行转换为子类指针引发的越界安全问题(因为new的是父类 子类的属性等并没有被构造 如果这时候访问就会越界)
//dynamic_cast会检测到这种不安全 并返回一个空值

int main() {
    //第一种情况 new 父类
    // 使用static_cast强转可能引发越界错误
    //Father* f = new Father;
    //Son* s = f; 不能通过编译 因为这样会不安全 父类指针类型不能赋值给子类指针
    //Son* s = static_cast<Son*>(f); 强转之后可以编译通过
    //std::cout << s->m_name << std::endl;  //运行时会出现越界错误 因为子类的成员没有被创建

    //而使用dynamic_cast避免了越界错误 dynamic_cast仅适用于存在继承与多态的对象之间
    //Father* f = new Father;
    //这种转换是不安全的 dynamic_cast对这种不安全的行为 会返回一个空值
    //Son* s = dynamic_cast<Son*>(f);
    //std::cout << s << std::endl;   //000000000


    //第二种情况 new 子类
    Father* f = new Son;
    f->Print(); //多态 打印的是子类的成员函数内容
    //f->m_name 即使new的是子类对象 但是通过父类指针无法访问到子类的属性
    //可以通过转换实现 这种时候两种转换都没什么区别
    //Son* s = dynamic_cast<Son*>(f);
    Son* s = static_cast<Son*>(f);
    std::cout << s->m_name << std::endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值