Mar*_*Kim 3 c++ inheritance casting static-cast
我的老师在我们的一个铸造示例中包含了以下几行.c
是Circle
继承自类的类的对象Point
.在我搜索问题的答案"我可以将类的对象转换Point
为类型Circle
吗?" 我发现他使用的语法与我曾经使用的每个网站不同.这些网站都使用static_cast
和dynamic_cast
语法.他不会在测试中使用static_cast和dynamic_cast,我只是想知道他在使用什么以及它是如何运作的.
另外,如果你能回答我是否可以将基础对象转换为派生类型,我非常感谢你.
output << "the center of the circle is at " << (Point) c;
// casting `Circle` object `c` with type `(Point)`, calls the first overloaded >stream insertion operator"
Run Code Online (Sandbox Code Playgroud)
(Point)c
被称为"C风格"演员.这基本上可以被认为是一个强力阵容,尽其所能使演员阵容成功.这意味着它可能最终导致static_cast
a const_cast
或甚至a reinterpret_cast
.
来自https://anteru.net/blog/2007/12/18/200/:
C样式转换,使用(类型)变量语法.有史以来最糟糕的发明.这会尝试按以下顺序执行以下强制转换:(另请参阅C++标准,5.4 expr.cast第5段)
- const_cast会
- 的static_cast
- static_cast后跟const_cast
- reinterpret_cast的
- reinterpret_cast后跟const_cast
而且你认为它只是一个邪恶的演员,实际上它是一个水..
来自Stroustrup本人:
最好避免使用显式类型转换(通常称为强制类型转换以提醒您它们用于支撑损坏的东西).
和
应该弃用C风格的强制转换,以支持命名强制类型转换.
Stroustrup,Bjarne.C++之旅(C++深度系列)(Kindle位置7134).皮尔逊教育.Kindle版.
所以建议使用命名演员.在实践中,我仍然会遇到使用C风格的强制转换的专业代码,因为它使代码更加简洁和可读,并且 - 如果你知道你在做什么 - 通常相当于static_cast
它所使用的地方.我认为C值风格的演员阵容如果因为这些原因在上下文中被使用是显而易见的,那么它很可能会导致a static_cast
,并且Stroustrup来自一个过于面向对象的视角,因为他一般不屑于演员.但你应该更喜欢命名演员.
你的老师可能正在使用C风格的演员表作为一个不那么可怕的演员介绍.