1. ホーム
  2. c++

[解決済み] "純粋な仮想メソッドが呼び出されました "の解決方法

2022-03-03 15:43:39

質問

なぜこのようなことが起こるのかは理解していますが、解決できずに困っています。以下は、私のプログラムが終了するときにエラーが発生する(したがって、クラッシュにつながる)ときに、私のコードが行っていることです...

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* オブジェクトを追加します。 のこのデストラクタの目的は SomeClassDerivedClass の特定のインスタンスを削除するために SomeClass のコレクションから QList<SomeClass*> .

では、具体的な例でいうと......。

BaseClass = Shape

DerivedClass = Triangle

SomeClass = ShapeProperties への参照を所有する Shape

だから、決して new ShapeProperties しかし、私は QList<ShapeProperties*> の内部には Triangle . のデストラクタは ShapePropertiesTriangle の特定のプロパティを削除するために ShapeProperties のコレクションから QList<ShapeProperties*> .

解決方法は?

あなたのデストラクタが呼ばれる頃には、継承したクラスのデストラクタはすでに呼ばれています。コンストラクタやデストラクタの中では、オブジェクトの動的型は事実上、静的型と同じと考えることができます。つまり、コンストラクタやデストラクタの内部で仮想メソッドを呼び出す場合、呼び出されるのはオーバーライドされたバージョンではありません。

もし SomePureVirtualMethod をデストラクタで呼び出す必要がある場合は、 欲しいメソッドの実際の定義があるクラスのデストラクタ内でそれを呼び出さなければなりません。