C/C++ | 两种类型的转换 reinterpret_cast、dynamic_cast

之前在类与类之间的类型转换用 dynamic_cast比较多,也就是常说的强转。
严格来说,dynamic_cast用于执行基于类层次结构的安全类型转换。常用于多态继承关系中进行向上或者向下转型。在转换的时候会进行类型检查,以确保转换的安全性。
reinterpret_cast 用于执行底层类型转换,可以将一个指针或引用转换成另一种没有关联的类型的指针或引用。而且其转换是不安全的,它可以将一个类型的指针解释为与其内存布局完全不相关的另一种类型指针。说明白一点,尝尝在把字符数组类型指针对象(也可以理解为字符串)转换成一个结构体对象指针,由于结构体的大小遵循一定的规则,比如大端排序或者小端排序。这一点需要注意,可能就会在这出现问题。

//使用 reinterpret_cast 将字符指针转换为结构体对象指针 示例
#include <iostream>

struct MyStruct {
    int value;
    char symbol;
};

int main() {
    char* charPtr = new char[sizeof(MyStruct)];
    // 假设 charPtr 指向一个包含结构体数据的字符数组

    MyStruct* structPtr = reinterpret_cast<MyStruct*>(charPtr);
    // 将字符指针转换为结构体对象指针

    // 访问结构体对象的成员
    structPtr->value = 10;
    structPtr->symbol = 'A';

    std::cout << "Value: " << structPtr->value << std::endl;
    std::cout << "Symbol: " << structPtr->symbol << std::endl;

    delete[] charPtr;

    return 0;
}

//dynamic_cast示例
class Base {
public:
    virtual ~Base() {}
};

class Derived : public Base {
public:
    void specificFunction() {
        std::cout << "Derived class specific function" << std::endl;
    }
};

int main() {
    Base* basePtr = new Derived();

    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
    if (derivedPtr != nullptr) {
        // 使用 dynamic_cast 将基类指针转换为派生类指针,并调用派生类的成员函数
        derivedPtr->specificFunction();
    } else {
        std::cout << "Dynamic cast failed" << std::endl;
    }

    delete basePtr;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值