はじめに:このノートはmoocの北京大学で中国の大学のためのコースを、対応するプログラミングとアルゴリズム(c)はC ++オブジェクト指向プログラミング、主に使用の独自のレビューのために、そしてこのノートは、上の使用CやJavaに基づいており、のみ異なり、CとJavaのための書き込みを行います
ポリモーフィズム
仮想関数および多型の基本的な考え方
- 仮想関数形式:クラスのメンバ関数プラスの前に
virtual
キーワード機能のメンバーは、仮想関数です。 virtual
関数宣言の前にキーワードのみ、特定の書き込み時に関数本体を記述する必要はありませんvirtual
(のようなキーワードをfriend
など)コンストラクタと静的メンバ関数は仮想にすることはできません。(しかし、デストラクタ)
多型:多型は、ここで同じとJavaではありません。定義:仮想関数としての基本クラスと同じ名前の派生クラスを呼び出すベースポインタによって(基準又はベースクラス)、ベースポインタ参照が基底クラスのオブジェクトである場合、それは基底クラス、仮想関数と呼ばれ、もしベースポインタ参照は、派生クラスの仮想関数と呼ばれるクラスのオブジェクトです。(同じ名前の基本クラスのポインタと通常の通話機能は、基底クラスの関数を呼び出し中)
多型の例
- 非非仮想関数呼び出しコンストラクタ、デストラクタメンバ関数では、多型です。
例:
class Base{
public:
void fun1() { fun2(); }
//这里的fun2()相当于this->fun2(),而this指针代表的是Base类,是基类指针,因此是多态。所以最后的输出结果是derived
vitural void fun2() { cout << base << endl; }
};
class Derived : public Base{
public:
vitural void fun2() { cout << derived << endl; }
};
int main(){
Derived d;
Base * p = & d;
p->fun1();
//输出结果是 derived
return 0;
}
- ベースとさえせずに、パラメータリストと同じ名前のクラスのクラスの仮想関数を導出
virtual
自動的に仮想関数になります。 - コンストラクタとデストラクタは、多型仮想関数呼び出しではない呼び出すと、そのクラスで定義された関数は、(定義されていない場合には、定義された基本クラスで同じ関数を呼び出し)であります
原則多型
各クラスは、仮想機能を有する(またはクラス仮想関数派生した)両方のクラスの仮想関数テーブル内の任意のオブジェクトに対して仮想関数テーブルポインタを有し、それはよりなりクラス仮想関数メモリサイズのオブジェクトであります4バイトのうち、4つの余分なバイトは、仮想関数テーブルポインタです。
仮想デストラクタ、そして純粋な抽象クラスのデストラクタ
- スルー基本クラスへのポインタを
delete
派生クラスのオブジェクトは、基本クラスのデストラクタを呼び出します。(ネイチャープログラムがクラスを派生されるデストラクタを呼び出すに出ている間、その後、基底クラスのデストラクタを呼び出します)派生クラスのデストラクタを呼び出し、その後、基底クラスのデストラクタを呼び出すために、基本クラスが必要ですデストラクタ宣言したvirtual
目的を達成するために、(このデストラクタ派生クラスの仮想関数がデフォルトになります)。 - 限り、クラスの仮想関数があるので、それはデストラクタ仮想デストラクタを書かれることをお勧めします。
例:
#include <iostream>
using namespace std;
class Son{
public:
virtual ~Son(){
cout << "bye from son" << endl;
}
};
class GrandSon:public Son{
public:
~GrandSon(){
cout << "bye form grandson" << endl;
}
};
int main(){
GrandSon s;
Son * p = & s;
delete p;
return 0;
}
- 純粋仮想関数:機能なしの仮想関数メンバの
文言例:virtual void Print() = 0 ;
- 抽象クラス:クラス(抽象クラスのJavaを使用して)抽象クラスと呼ばれる純粋仮想関数が含まれています
- 新しいクラスを派生する唯一の基底クラスとして抽象クラスは、抽象クラスのオブジェクトを作成することはできません。
- 抽象クラスのメンバ関数は純粋仮想関数で呼び出されますが、コンストラクタやデストラクタではない、純粋仮想関数呼び出し内にすることができます。