Scott Meyers の『Effective C++ 』を読んでいて、継承に関するセクションにいます。彼は言った
純粋仮想関数は、インターフェイスの継承のみを指定します。
単純な (不純な) 仮想関数は、インターフェイスの継承と既定の実装の継承を指定します。
ここで、次の 2 つのクラスを考えます。
struct A {
virtual void foo() = 0;
};
void A::foo(){ std::cout << "Default foo" << std::endl; }
struct B : A{
virtual void foo(){ A::foo(); std::cout << "Derived foo" << std::endl; }
};
例で行ったように、純粋な仮想関数のデフォルトの実装を提供し、 を介して呼び出すことができますqualified-function-call-expression
。不純な仮想関数についてもほぼ同じことができます
struct A {
virtual void foo(); //No longer pure virtual
};
void A::foo(){ std::cout << "Default foo" << std::endl; }
struct B : A{
virtual void foo(){ A::foo(); std::cout << "Derived foo" << std::endl; }
};
次のように不純な仮想関数を定義しない場合:
struct A {
virtual void foo();
};
struct B : A{
virtual void foo(){ std::cout << "Derived foo" << std::endl; }
};
それは完全にうまくいくでしょう。
では、純粋仮想関数の唯一の目的は、クラスを抽象化する (インスタンス化できない) ことですか?