从 c++ 中派生类的析构函数调用虚函数



这是我的 c++ 代码片段

class A {
public:
virtual void method() {
cout << "A::method" << endl;
}
virtual ~A() {
cout << "A::destructor" << endl;
}
};
class B : public A {
public:
virtual void method() {
cout << "B::method" << endl;
}
virtual ~B() {
cout << "B::destructor" << endl;
method();
}
};
int _tmain()
{    
A* a = new B();
a->method();
delete a;
return 0;
}

我了解到,从构造函数或析构函数调用任何虚函数是不可取的。 在派生类 B 的析构函数中,我调用名为"method(("的虚函数。

这是输出消息。

B::method
B::destructor
B::method
A::destructor

在我看来根本没有问题。虚拟函数知道其对象类型并打印 "B::method(("。这是一种应该避免的未定义行为吗?

从概念上讲,B中的所有虚函数都可以在析构函数主体中访问,因此您的代码很好,并且定义得很好。

但是你的代码非常脆弱:如果有一个method覆盖的子类B,那就另当别论了。在这种情况下,在B的析构函数正文中写入B::method();就足够了。

简短回答:最好避免在构造函数和析构函数中调用虚拟方法。

最新更新