这是我的 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();
就足够了。
简短回答:最好避免在构造函数和析构函数中调用虚拟方法。