gpt4 book ai didi

c++ - dynamic_cast "this"到派生类型 : when is it legal?

转载 作者:太空狗 更新时间:2023-10-29 20:38:53 27 4
gpt4 key购买 nike

这是一段显然不起作用的代码,因为在构造函数中向下转换“this”是非法的:

#include <cassert>

class A {
protected:
virtual ~A() {}
public:
A();
};

class B : public A {
};

A::A() {
assert(dynamic_cast<B*>(this));
}

int main(void) {
B b;
return 0;
}

正如预期的那样,当使用 g++ 编译时,断言失败。

这是另一个有效的代码(至少在 g++ 4.7 中,我还没有尝试过其他编译器):

#include <cassert>

class A {
protected:
virtual ~A() {}
public:
A() {}
void f();
};

class B : public A {
public:
B() {
f();
}
};

void A::f() {
assert(dynamic_cast<B*>(this));
}

int main(void) {
B b;
return 0;
}

我的问题是:第二个代码是“合法的”吗?也就是说,我可以期望任何编译器都能以这种方式工作吗?

我的直觉是,由于 f() 是从 B 的构造函数的主体中调用的,因此“b”已经作为类型 B 的实例得到了良好的构造,这使得代码合法。然而,我仍然有点 dynamic_casting 来自构造函数的“this”......

(请注意,我的问题不是这是否是好的做法,而是它是否合法)。

最佳答案

是的,第二个例子定义好,强制转换成功。 B 的构造函数中,对象的动态类型为 B,因此转换为 B* 会成功。

在第一个示例中,如您所说,在 A 的构造函数中,动态类型是 A,因此转换为 B*会失败。

关于c++ - dynamic_cast "this"到派生类型 : when is it legal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29946327/

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