通常,在C++中需要用到各种类型转换,典型的如const_cast, dynamic_cast, reinterpret_cast, static_cast。
这时讲两种实现办法: dynamic_cast和直接计算的办法
(1) dynamic_cast最常用的,dynamic_cast: 动态类型转换,可以在父类与子类之间进行安全的类型转换,运行时类型检查,并且可以知道自己子类的类型。缺点是耗时稍微有点长。 reinterpret_cast: 强制类型转换,可以在不同类型之间进行强制转换,很难保证移植性。速度快。
这里不打算对各个类型转换进行详细解释,相关文档网络上相当多。这 里只重点讲一下dynamic_cast。
dynamic_cast最大的好处是可以用来进行“安全向下转换”。
假设有类A、B和C,如下,
class A {
};
class B : public class A {
};
class C : public class B {
};
A* pc = new C;
当我们将父类指针指向一个new出来的子类B或C对象时,那么可以使用dynamic_cast将该指针类型安全转换为C或B。
我们来运行一下下面的例子,重点是注意最后那个指针p_grand,
#include
using namespace std;
template
inline bool instanceof(const T* ptr) {
return dynamic_cast(ptr) != nullptr;
}
class GrandParent {
public:
GrandParent() {}
virtual void test() = 0;
};
class Parent : public GrandParent
{
public:
virtual ~Parent() {}
virtual void test() { std::cout
关注
打赏
热门博文
- 对CSDN网站关于抄袭的投诉的处理建议
- Tesseract OCR训练时碰到的问题和解决方案
- VSCODE在Jetson Nano上打不上断点,无法调试python源码
- ROS2进阶:在windows10上用vs2019编译rviz2
- ROS2 ERROR: OpenGL 1.5 is not supported in GLRenderSystem::initialiseContext at C:\ci\ws\build...
- ROS2 error: can‘t find examples_rclcpp_minimal_subscriber/Release/wait_set_subscriber_library.lib
- 在windows上安装 chocolatey.1.1.0.nupkg
- Qt开发高级进阶:如何在显示时适合视窗宽度和高度(fitWidth+fitHeight)
- PySpark ERROR: Python in worker has different version 3.9 than that in driver 3.8
- cv2.imshow error: The function is not implemented. Rebuild the library with Windows...