呼び出されたC ++エラー純粋仮想メソッド



C Error Pure Virtual Method Called



呼び出されたC ++エラー純粋仮想メソッド

  • UnitTest(ユニットテスト)を実行しているある日、終了Gtestデストラクタが次のエラーを報告しました
..... ..... ..... [ PASSED ] X tests. pure virtual method called terminate called without an active exception Segmentation fault
  • 文字通りの意味によれば、それは純粋仮想関数を呼び出すことです。
  • 一般に、純粋仮想関数の実装宣言がない場合。オブジェクトを作成するとき、コンパイラは検査に合格しません。例は次のとおりです。
#include class Parent { public: Parent() { } virtual ~Parent() { } virtual void crash() = 0 void init() { } } class Child : public Parent { public: Child() { } } int main() { Child c return 0 }
  • コンパイルエラー:
error: cannot declare variable ‘c’ to be of abstract type ‘Child’ Child c note: because the following virtual functions are pure within ‘Child’ class Child : public Parent note: virtual void Parent::crash() virtual void crash() = 0
  • それで、問題の原因は?
  • 1つ目:親クラスのコンストラクター関数、純粋仮想関数呼び出し。
#include class Parent { public: Parent() { init() } virtual ~Parent() { } virtual void crash() = 0 void init() { // Call Pure Virtaul crash() } } class Child : public Parent { public: Child() { } void crash() { return } } int main() { Child c return 0 }
  • 2番目:予期しないデストラクタ
#include class Parent { public: Parent() { std::cout << 'Parent' << std::endl } virtual ~Parent() { std::cout << '~Parent' << std::endl } virtual void crash() = 0 } class Child : public Parent { public: Child() { std::cout << 'Child' << std::endl } virtual ~Child() { std::cout << '~Child' << std::endl } void crash() { return } } int main() { Child *p = new Child() p->~Child() p->crash() return 0 }