【发布时间】:2020-09-29 16:19:06
【问题描述】:
这是我的 c++ 代码的 sn-p
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::方法()”。这是一种应该避免的未定义行为吗?
【问题讨论】:
-
不是UB,不是编程错误。这很容易出错,需要格外小心。如果你可以重构你的程序来避免它,那么你未来的错误就会更少,你未来的自己和其他团队成员都会因此而爱上你。
-
现在,尝试定义
class C : public B覆盖method,看看当你创建和销毁C类型的对象时会发生什么。 -
@YSC 我刚刚定义了 class C。 class C : public B { public: virtual void method() { cout 方法();删除一个;返回0;并且输出消息在这里: C::method C::destructor C::method B::destructor B::method A::destructor
-
是的。如果这是您的程序的预期行为,那很好。如果没有,你就有了一个错误并且很难追踪。 demo
-
感谢您帮助我。我坚信对于未来的自己,应该避免使用构造函数或析构函数中的虚函数。
标签: c++