如何在 c++ 中实现static_cast
How is static_cast implemented in c++?
static_cast
如何工作?如果你正在做这样的事情...
如果 D 通过某个未指定的层次结构(不一定是直接(从 B 继承,并且您这样做:
B* b = new D();
D* d = static_cast<D*>(b);
发生了什么事情?它是否只是在编译时计算偏移并将该偏移量应用于指针?还是在运行时发生了一些事情来做演员表?
发生了什么事情?
编译器假定您知道自己在做什么,因此指针确实指向D
对象,并相应地更改指针类型,必要时调整值以指向完整的D
对象而不是B
子对象。
如果你弄错了,并且使用了一个并不真正指向D
对象的D*
指针,那么你就会得到未定义的行为;所以要小心。
它是否只是在编译时计算偏移并将该偏移量应用于指针?
是的。
还是在运行时发生了一些事情来做演员表?
不;"静态"意味着它仅使用编译时信息。唯一的运行时活动是在必要时添加固定偏移量。
如果要在运行时检查转换是否有效(只要类型是多态的(,请使用 dynamic_cast
。如果那里没有真正的D
对象,它将提供一个空指针(或者如果你正在转换引用而不是指针,则会引发bad_cast
异常(。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- C++Cast运算符过载
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 收到错误"invalid use of non-static data member 'stu::n' "
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- "static char __ = []() -> char"的含义
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- 无法在 DLL 中链接 SDL2-static.lib
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- C++线程"Call to non-static member function without an object argument"
- 出现这种错误的原因是什么"invalid use of non-static data member "
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- static是如何使用ClassA::m_variable处理所有类对象的
- 在[expr.static.cast]/4中,术语"一个可行函数"指的是什么