虚関数と純虚関数
2675 ワード
参考『C/C++プログラマー面接宝典』
虚関数と純虚関数
虚関数の主な役割は抽象モデルを構築することであり,それによってシステムの拡張を容易にする目的を達成することができる.純虚関数とは、具体的に実現されない虚関数として明記され、特殊な虚関数である.
両者の区別
虚関数は、protectedまたはpublicのアクセス権を持つベースクラスの非静的メンバー関数である必要があります.ベースクラスのクラス定義で虚関数を定義する形式は、次のとおりです.
虚関数は、派生クラスオブジェクトのベースクラス関数を非表示にする概念を拡張し、プログラムが類似ファミリーの異性オブジェクトの集合にある場合に使用します.
純虚関数は特殊な虚関数であり、その一般的なフォーマットは以下の通りである.
多くの場合、ベースクラスでは虚関数に有意義な実装を与えることができず、それらを純粋な虚関数として説明し、その実装はそのベースクラスの派生クラスに残される.これが純虚関数の役割です.
虚関数と純虚関数の違いは、純虚関数は虚関数のサブセットであり、抽象クラスに用いられ、純虚関数を含むクラスは抽象クラスであり、オブジェクトを生成できないことである.
純粋な虚関数の使用方法
実用的なマルチステートを容易にするために、プログラマは常にベースクラスで仮想関数を定義する必要があります.多くの場合,蓄積自体がオブジェクトを生成するのは理不尽である.例えば、動物は基種としてサルやサイなどの子類を派生させることができるが、動物自体の生成対象は明らかに不合理である.
上記の問題を解決するために,純虚関数の概念を導入し,関数を純虚関数として定義すると,コンパイラは派生クラスに再ロードして多態性を実現しなければならないことを要求する.純粋な虚関数を同時に含むクラスを抽象クラスと呼び,オブジェクトを生成できない.これで上記の2つの問題をうまく解決しました.純粋な虚関数で使用されるコードの例は次のとおりです.
上記のコードでは、f 1()は通常のリロードです.呼び出しm_j->f1();Aクラスのf 1を呼び出します.プログラミング者がコードを書くときに決めます.つまり、それがAクラスによって定義されていることから、このクラスの関数が呼び出されます.f 2()は虚関数である.呼び出しm_j->f2();m_が呼び出されますjは保存されたオブジェクトに対して,newのBオブジェクトによるこの関数に対応する.f 3()はf 2()と同様であるが,ベースクラスでは書き込み関数実装は不要である.
純粋な虚関数は、意味のない実装を定義するために使用され、抽象クラスで派生クラスに特定の実装を渡す必要がある方法に使用されます.
虚関数と純虚関数
虚関数の主な役割は抽象モデルを構築することであり,それによってシステムの拡張を容易にする目的を達成することができる.純虚関数とは、具体的に実現されない虚関数として明記され、特殊な虚関数である.
両者の区別
虚関数は、protectedまたはpublicのアクセス権を持つベースクラスの非静的メンバー関数である必要があります.ベースクラスのクラス定義で虚関数を定義する形式は、次のとおりです.
virtual ( )
{
}
虚関数は、派生クラスオブジェクトのベースクラス関数を非表示にする概念を拡張し、プログラムが類似ファミリーの異性オブジェクトの集合にある場合に使用します.
純虚関数は特殊な虚関数であり、その一般的なフォーマットは以下の通りである.
class
{
virtual ( ) = 0;
...
}
多くの場合、ベースクラスでは虚関数に有意義な実装を与えることができず、それらを純粋な虚関数として説明し、その実装はそのベースクラスの派生クラスに残される.これが純虚関数の役割です.
虚関数と純虚関数の違いは、純虚関数は虚関数のサブセットであり、抽象クラスに用いられ、純虚関数を含むクラスは抽象クラスであり、オブジェクトを生成できないことである.
純粋な虚関数の使用方法
実用的なマルチステートを容易にするために、プログラマは常にベースクラスで仮想関数を定義する必要があります.多くの場合,蓄積自体がオブジェクトを生成するのは理不尽である.例えば、動物は基種としてサルやサイなどの子類を派生させることができるが、動物自体の生成対象は明らかに不合理である.
上記の問題を解決するために,純虚関数の概念を導入し,関数を純虚関数として定義すると,コンパイラは派生クラスに再ロードして多態性を実現しなければならないことを要求する.純粋な虚関数を同時に含むクラスを抽象クラスと呼び,オブジェクトを生成できない.これで上記の2つの問題をうまく解決しました.純粋な虚関数で使用されるコードの例は次のとおりです.
class A
{
public:
A();
void f1();
virtual void f2();
virtual void f3() = 0;
virtual ~A();
} //
class B: public A //
{
public:
B();
void f1();
void f2();
void f3();
virtual ~B();
}
int main(int argc, char* argv[]) //
{
A *m_j = new B();
m_j -> f1();
m_j -> f2();
m_j -> f3();
delete m_j;
return 0;
}
上記のコードでは、f 1()は通常のリロードです.呼び出しm_j->f1();Aクラスのf 1を呼び出します.プログラミング者がコードを書くときに決めます.つまり、それがAクラスによって定義されていることから、このクラスの関数が呼び出されます.f 2()は虚関数である.呼び出しm_j->f2();m_が呼び出されますjは保存されたオブジェクトに対して,newのBオブジェクトによるこの関数に対応する.f 3()はf 2()と同様であるが,ベースクラスでは書き込み関数実装は不要である.
純粋な虚関数は、意味のない実装を定義するために使用され、抽象クラスで派生クラスに特定の実装を渡す必要がある方法に使用されます.