之前在类与类之间的类型转换用 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;
}