析构函数中的动态转换

gre*_*f82 8 c++ polymorphism destructor dynamic-cast multiple-inheritance

这个代码合法吗?

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;
}
Run Code Online (Sandbox Code Playgroud)

我看到了两张照片,但我应该只看到一张。我猜动态演员是错误的。可以做这种检查吗?

gre*_*f82 7

也许我自己找到了解决方案,答案是否定的,这是不可能的:

来自cppreference.com 文档的第 6 条

当 dynamic_cast 用于构造函数或析构函数(直接或间接),并且表达式引用当前正在构造/销毁的对象时,该对象被认为是最派生的对象。如果 new-type 不是指向构造函数/析构函数自己的类或其基类之一的指针或引用,则行为未定义。

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

由于我在 Base2 析构函数中强制转换为 Base1,因此此行为未定义。