c – dynamic_cast“this”到派生类型:什么时候合法?
作者:互联网
这是一个显然不起作用的代码,因为在构造函数中向下转换“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;
}
我的问题是:第二个代码是“合法的”,即我可以期望任何编译器都可以这样工作吗?
我的直觉是,因为从B的构造函数的主体调用f(),所以“b”已经很好地形成为类型B的实例,这使得代码合法.然而,我仍然有点像构造函数那样动态播放“this”……
(请注意,我的问题不是这是否是好的做法,只要它是合法的).
解决方法:
是的,第二个例子定义明确,演员表会成功.在B的构造函数期间,对象的动态类型是B,因此对B *的强制转换将成功.
在第一个例子中,如你所说,在A的构造函数中,动态类型是A,因此对B *的强制转换将失败.
标签:downcast,dynamic-cast,c,inheritance 来源: https://codeday.me/bug/20190829/1764217.html