浮点数-Float-Double转二进制 - ToolTT在线工具箱
Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析 - 谢维开 - 博客园
c++ dynamic_cast
dynamic_cast 是 C++ 中用于在运行时安全地进行多态类型转换的操作符。它特别有用在涉及继承层次结构的指针或引用之间转换时,其中类型安全是一个关键问题。dynamic_cast 支持两种类型的转换:
- 向下的(从基类到派生类):当你试图将一个指向基类对象的指针或引用安全地转换为指向派生类对象的指针或引用时。这种转换在运行时进行检查,如果转换是非法的(例如,实际对象并不是目标派生类的一个实例),则指针类型的转换会返回 nullptr,引用类型的转换会抛出 std::bad_cast 异常。
- 向上的(从派生类到基类):虽然这种类型的转换在编译时通过普通的强制类型转换(static_cast)就可以实现,但 dynamic_cast 同样支持这种类型的转换,并且在运行时不会进行任何检查,因为向上转换总是安全的。
使用 dynamic_cast 的前提条件
为了使用 dynamic_cast,需要满足以下条件:
- 操作的对象类型必须是多态的,这意味着类必须至少有一个虚函数。通常,这意味着类有一个虚析构函数或者至少一个其他虚函数。
- 你只能在指针(或引用)类型之间使用 dynamic_cast,这些类型涉及继承。
示例
下面是一个使用 dynamic_cast 的简单示例,展示了如何在基类指针和派生类指针之间进行转换。
cppCopy Code
#include <iostream>
#include <typeinfo>
class Base {
public:
virtual ~Base() {} // 为了使 Base 成为多态类,添加一个虚析构函数
};
class Derived : public Base {
void derivedFunc() { std::cout << "Derived function.\n"; }
};
class AnotherClass : public Base {};
int main() {
Base* b1 = new Derived();
Base* b2 = new AnotherClass();
Derived* d = dynamic_cast<Derived*>(b1);
if (d != nullptr) {
d->derivedFunc(); // 成功转换,调用派生类的函数
} else {
std::cout << "b1 is not of type Derived\n";
}
Derived* d2 = dynamic_cast<Derived*>(b2);
if (d2 == nullptr) {
std::cout << "b2 is not of type Derived\n"; // 转换失败
}
delete b1;
delete b2;
return 0;
}
在这个例子中,b1 实际上指向一个 Derived 对象,所以 dynamic_cast<Derived*>(b1) 成功,并返回一个指向 Derived 对象的指针。而 b2 指向一个 AnotherClass 对象,所以 dynamic_cast<Derived*>(b2) 失败,并返回 nullptr。