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)
我看到了两张照片,但我应该只看到一张。我猜动态演员是错误的。可以做这种检查吗?
也许我自己找到了解决方案,答案是否定的,这是不可能的:
当 dynamic_cast 用于构造函数或析构函数(直接或间接),并且表达式引用当前正在构造/销毁的对象时,该对象被认为是最派生的对象。如果 new-type 不是指向构造函数/析构函数自己的类或其基类之一的指针或引用,则行为未定义。
另请参阅标准的 [class.cdtor]/6。
由于我在 Base2 析构函数中强制转换为 Base1,因此此行为未定义。