如何解决“称为纯虚方法”(How to resolve “pure virtual method c

2019-06-24 16:17发布

我明白这是为什么发生的事情,但我坚持努力解决它...这里是我的代码做的是产生错误时(因此,导致崩溃)时,我的程序退出...

pure virtual method called

SomeClass::~SomeClass()
{
   BaseClassObject->SomePureVirtualMethod(this);
}

void DerivedClass::SomePureVirtualMethod(SomeClass* obj)
{
    //Do stuff to remove obj from a collection
}

我从来没有一个电话new SomeClass ,但我有一个QList<SomeClass*>我追加SomeClass*对象。 该析构函数的目的SomeClass是告诉DerivedClass删除的特定实例SomeClass从它的收藏QList<SomeClass*>

因此,在一个具体的例子?

BaseClass = Shape

DerivedClass = Triangle

SomeClass = ShapeProperties拥有一个参照Shape

所以,我从来没有一个电话new ShapeProperties但我有一个QList<ShapeProperties*>的内Triangle 。 在析构函数ShapeProperties是告诉Triangle删除的特定属性ShapeProperties从它收集QList<ShapeProperties*>

Answer 1:

通过您的析构函数被调用的时候,继承类的析构函数已经被调用。 内构造和析构,该对象的动态类型可有效地认为是相同的静态类型。 也就是说,当你调用您的构造函数/析构函数中的虚拟方法,这不是他们的被覆盖的版本的被调用。

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



Answer 2:

当调用virtual的基类的析构函数方法SomeClass调用方法( SomePureVirtualMethod()的基类) SomeClass是没有定义的纯虚方法。 因此错误。

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

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

C ++ 03 10.4 / 6的状态

“成员函数可以从一个抽象类的构造(或析构函数)被调用;从这样的构造被创建直接或间接地使虚拟呼叫(10.3),以纯虚函数为对象的效果(或破坏)(或析构函数)是不确定的。”

如何避免呢?
只要确保你不从构造函数或析构函数调用纯虚函数。
不要叫virtual除非你了解所涉及的动力学构造函数和析构函数的方法。



文章来源: How to resolve “pure virtual method called”