gpt4 book ai didi

c++ - 这个 static_cast 到底有什么不安全的地方?

转载 作者:行者123 更新时间:2023-11-28 02:06:02 24 4
gpt4 key购买 nike

我写了一个不安全的 static_cast 的小例子:

#include <iostream>

class A
{
public:
virtual int getA(){ return 1; }
};

class B : public A
{
public:
virtual int getA() { return 2; }
int getB() { return 3; }
};

int main()
{
A a;
B b;
B* b1 = static_cast<B*>(&a);

std::cout << "b.getA(): " << b.getA() << std::endl;
std::cout << "b.getB(): " << b.getB() << std::endl;
std::cout << "b1->getA(): " << b1->getA() << std::endl;
std::cout << "b1->getB(): " << b1->getB() << std::endl;
}

输出:

b.getA(): 2
b.getB(): 3
b1->getA(): 1
b1->getB(): 3

我认为它不安全,因为我在创建 b1 时从不运行 B 构造函数,尽管它是作为 B 对象访问的。显然,输出的差异表明 b1 没有指向 B 对象,而是指向 A 对象,正如预期的那样。

还有哪些方面是不安全的。像这样执行 static_cast 是否涉及未定义的行为?否则,访问 getAgetB 方法可能是未定义的行为吗?

还有吗? (我不关心丢失的虚拟析构函数,在这个例子中我不关心)

cpp.sh 上可用的代码:http://cpp.sh/7sxtz

最佳答案

static_cast<B *>(&a)导致未定义的行为。

C++14 [expr.static.cast]/11:

[...] If the prvalue of type “pointer to cv1 B” points to a B that is actually a subobject of an object of type D, the resulting pointer points to the enclosing object of type D. Otherwise, the behavior is undefined.

关于c++ - 这个 static_cast 到底有什么不安全的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37481434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com