在构造和销毁过程中调用虚拟方法导致编译器错误?我听说这样做很危险。
我知道如果我有一个 Class Base
定义了一个虚方法 foo()
,那么 foo()
的分辨率是 <Base
的所有子类中的 strong>dynamic。因此,如果子类 Derived
覆盖了 foo()
,那么 Derived::foo()
就会被调用。那么,为什么在构造/析构期间调用虚方法 会使编译器感到困惑?
从构造函数中调用它们和在构造函数外部调用它们有什么区别?
最佳答案
在构造Base()
时,派生类还没有被初始化,也并不真正存在。当您调用虚方法时,您的调用将转至 Base::foo()
。这不一定是错误的,但通常是出乎意料的,因此普遍禁止这样做。
类似地在销毁期间,Derived 在 ~Base()
被调用之前被销毁,因此虚拟方法调用将再次转到 Base::foo()
,这又是经常出乎意料。
关于c++ - 在构造和销毁期间调用虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13459927/