析构函数中的动态转换

灰太狼82

此代码合法吗?

class Base1 {
};

class Base2 {
public:
    virtual ~Base2() {
        if (!dynamic_cast<Base1*>(this))
            std::cout << "aaaa" << std::endl;
    }
    Base2() {
    }
};

class MyClass: public Base1, public Base2 {
public:
    MyClass() {
    }
    virtual ~MyClass() {
        std::cout << "bbb" << std::endl;
    }
};

int main() {
    MyClass s;
    return 0;
}

我看到了两个打印件,但我只能看到一个。我猜动态转换是错误的。可以进行这种检查吗?

灰太狼82

也许我自己找到了解决方案,但回答是“不可能”:

cppreference.com文档的项目符号6中

当在构造函数或析构函数(直接或间接)中使用dynamic_cast时,表达式表示当前正在构造/破坏的对象,则该对象被认为是派生程度最高的对象。如果new-type不是指针或对构造函数/析构函数自己的类或其基础之一的引用,则该行为是不确定的。

另请参阅标准的[class.cdtor] / 6。

由于我要在Base2析构函数中强制转换为Base1,因此此行为是不确定的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章