从 c++ 中派生类的析构函数调用虚函数
Calling a virtual function from a destructor of a derived class in 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();
就足够了。
简短回答:最好避免在构造函数和析构函数中调用虚拟方法。
相关文章:
- 析构函数调用
- 在具有向量的类构造函数中进行析构函数调用
- 从 c++ 中派生类的析构函数调用虚函数
- C++析构函数调用两次,堆栈分配的复合对象
- C++ 在析构函数调用之前删除的动态成员数组
- 析构函数调用c++中的一个向量
- Singleton模式中的手动析构函数调用:调用多次
- 从内部类的析构函数调用虚拟函数
- 与 boost odeint 集成期间的析构函数调用
- 堆栈展开如何与析构函数调用有关?
- C++:优化析构函数调用
- 以逗号分隔的表达式中的析构函数调用
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 从C++中的虚拟析构函数调用虚拟方法
- 从指针返回对象时出现意外的析构函数调用
- 使用 decltype 显式析构函数调用
- C++析构函数调用了错误的对象
- 了解虚拟函数和析构函数调用
- 多重继承析构函数调用他自己和父析构函数?c++
- 析构函数调用表单不适当的库