如何解决"纯虚方法"

use*_*525 18 c++ polymorphism base-class derived-class pure-virtual

我明白为什么会发生这种情况,但我一直试图解决它...这是我的代码在我的程序退出时生成错误(因此导致崩溃)时所做的事情...

pure virtual method called

SomeClass::~SomeClass()
{
   BaseClassObject->SomePureVirtualMethod(this);
}
Run Code Online (Sandbox Code Playgroud)
void DerivedClass::SomePureVirtualMethod(SomeClass* obj)
{
    //Do stuff to remove obj from a collection
}
Run Code Online (Sandbox Code Playgroud)

我从来没有打过电话,new SomeClass但我有一个QList<SomeClass*>我追加SomeClass*对象的东西.这个析构函数的目的SomeClass是告诉从它的集合中DerivedClass删除一个特定的实例.SomeClassQList<SomeClass*>

所以,在一个具体的例子......

BaseClass = Shape

DerivedClass = Triangle

SomeClass= ShapeProperties拥有对的引用Shape

所以,我从来没有打过电话,new ShapeProperties但我有一个QList<ShapeProperties*>内心Triangle.析构函数ShapeProperties是告诉从它的集合中Triangle删除特定属性.ShapePropertiesQList<ShapeProperties*>

K-b*_*llo 31

在调用析构函数时,已经调用了继承类的析构函数.在构造函数和析构函数中,对象的动态类型可以有效地被认为与静态类型相同.也就是说,当你从构造函数/析构函数中调用虚方法时,它不是被调用的它们的覆盖版本.

如果SomePureVirtualMethod需要在析构函数中调用,那么您将必须在类的析构函数中调用它,在该类的析构函数中,您需要的方法的实际定义是.


Alo*_*ave 11

当你virtual在Base类的析构函数中调用该方法时,SomeClass它调用Base类的method(SomePureVirtualMethod()),SomeClass这是一个没有定义的纯虚方法.因而错误.

为什么会这样?
该类型this的构造函数和析构函数是它的构造和析构函数被调用,因此动态调度在构造函数和析构函数不工作,你希望它在所有其他职能的工作类型.

为什么会崩溃?
因为从构造函数或析构函数调用纯虚函数是未定义的行为.

C++ 03 10.4/6状态

"可以从抽象类的构造函数(或析构函数)调用成员函数;对于从这样的构造函数创建(或销毁)的对象,直接或间接地对纯虚函数进行虚拟调用(10.3)的效​​果(或析构函数)未定义."

怎么避免呢?
只需确保不要从构造函数或析构函数中调用纯虚函数.除非您了解所涉及的动态,否则
不要virtual在构造函数或析构函数中调用方法.