C++入门教程(七十七):基类和派生类相互转换

本文介绍了C++中基类和派生类之间的转换方法,包括裸指针的隐式和显式转换,重点讨论了dynamic_cast在运行时的安全检查及其对性能的影响。同时,提到了智能指针转换时应使用的std::dynamic_pointer_cast和std::static_pointer_cast。
摘要由CSDN通过智能技术生成

小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/video/av20868986/

目录

基类和派生类的裸指针转换

基础示例 1

#include <iostream> // std::cout std::endl

class base
{
public:
    virtual ~base(void) = default;
};

class derived : public base
{
};

int main(void)
{
    // 派生类对象
    derived derivedobj;
    std::cout << "派生类对象的地址是:" << &derivedobj << std::endl;

    // 基类裸指针保存派生类对象的地址(隐式转换)
    base *pointer1 = &derivedobj;
    std::cout << "隐式转换后,基类裸指针保存的地址是:" << pointer1 << std::endl;

    // 基类裸指针保存派生类对象的地址(static_cast转换)
    base *pointer2 = static_cast<base *>(&derivedobj);
    std::cout << "static_cast转换后,基类裸指针保存的地址是:" << pointer2 << std::endl;

    // 用派生类裸指针保存基类裸指针的值(不能隐式转换)
    // derived *pointer3 = pointer1; // 去掉开头注释将会编译报错

    // 用派生类裸指针保存基类裸指针的值(dynamic_cast转换)
    derived *pointer4 = dynamic_cast<derived *>(pointer1);
    std::cout << "dynamic_cast转换后,派生类裸指针保存的地址是:" << pointer4 << std::endl;

    // 用派生类裸指针保存基类裸指针的值(static_cast转换)
    derived *pointer5 = static_cast<derived *>(pointer1);
    std::cout << "static_cast转换后,派生类裸指针保存的地址是:" << pointer5 << std::endl;

    return 0;
}
<
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值