其他分享
首页 > 其他分享> > c – dynamic_cast“this”到派生类型:什么时候合法?

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