【发布时间】:2023-03-30 07:05:01
【问题描述】:
我正在阅读有关static_cast 运算符的信息。
考虑以下示例:
#include <iostream>
class B { };
class D : public B
{
public:
void fun()
{
std::cout<<"fun() is called\n";
}
};
void f(B* pb,D* pd)
{
D* pd2=static_cast<D*>(pb);
B* pb2=static_cast<B*>(pd);
pd2->fun();
}
int main()
{
B b;
D d;
f(&b,&d);
}
上面写着:
在下面的示例中,行 D* pd2 = static_cast(pb);是 不安全,因为 D 可以具有不在 B 中的字段和方法。 但是,行 B* pb2 = static_cast(pd);是一个安全的转换 因为 D 总是包含所有的 B。
与 dynamic_cast 相比,没有运行时检查 pb 的 static_cast 转换。 pb指向的对象可能不是 D 类型的对象,在这种情况下可以使用 *pd2 惨重。例如,调用一个属于 D 成员的函数 类,但不是 B 类,可能会导致访问冲突。
我在 gcc 4.8.1 和 MSVS 2010 上尝试过并获得输出 fun() 被调用。那么这个程序会调用未定义的行为吗?我的程序会在运行时崩溃吗? C++ 标准对此有何评论?如果我理解不正确,请纠正我。
【问题讨论】:
-
@Downvoters:谁投了反对票?为什么要投反对票?我的问题有什么问题?
-
@mah:语言明确说这是UB。不过,总的来说,您在这方面基本上是正确的。
-
我没有投反对票,但那些投反对票的人可能已经这样做了,因为这个问题很愚蠢。为什么您期望在
X类型的不相关对象上调用函数Y::foo()以具有明确定义的语义?这显然是荒谬的。 -
它还能做什么?
-
@mah:我同意;我很惊喜。 :)
标签: c++ inheritance language-lawyer undefined-behavior static-cast