C++中の書き換え、積載、再定義

2225 ワード

転載先:http://blog.csdn.net/xie376450483/article/details/6053031
1.書き換え(override):
      親と子の多形性親クラスに同じ名前とパラメータの虚数関数があるとサブクラスが再定義します.
1)書き換えられた関数はstaticのものではない.Virtualであるか、またはoverrideである必要があります(すなわち、関数は最初のベースクラスでvirtualとして宣言されています.c++にはoverrideがありません).
2)書き換え関数は同じ種類、名前とパラメータリスト(同じ関数のプロトタイプ)が必要です.
3)書き換え関数のアクセス識別子は異なることができます.virtualはprvateですが、派生類の中でpublicに書き換えて、protectedもいいです.
2.オーバーロード(overload):
      関数名は同じですが、パラメータテーブルの数や順番は異なります.ただし、戻るタイプでは判断できません.
 
3.再定義(redefining):
      親クラスに同じ名前の虚関数でないものをサブクラスで再定義します.
      再定義されたサブクラスの呼び出し関数は、サブクラスの自分の関数です.親の関数は非表示になります.名前の隠し特性.親クラスの同名の関数を呼び出したい場合は、親タイプにスコープを加えて呼び出しの関数を指定する必要があります.
 
オーバーロードとカバーの違いPK(overload)1、方法のカバーはサブクラスと親タイプの関係で、垂直関係です.方法の荷重は同じクラスの方法間の関係です.   レベル関係です.  2、カバー要求パラメータのリストは同じです.リロード要求パラメータのリストが異なります.  3、カバー関係では、そのメソッド体を呼び出し、オブジェクトのタイプ(オブジェクトに対応する格納空間タイプ)によって決定される.リロード関係は、呼び出し時の実参照表とイメージ表からメソッド体を選択します.
class Base {
private:
	virtual void display() { cout<<"Base display()"<<endl; }
	void say(){ cout<<"Base say()"<<endl; }

public:
	void exec(){ display(); say(); }
	void f1(string a) { cout<<"Base f1(string)"<<endl; }
	void f1(int a) { cout<<"Base f1(int)"<<endl; }   //overload
};

class DeriveA:public Base{
public:
	void display() { cout<<"DeriveA display()"<<endl; }   //override
	void f1(int a,int b) { cout<<"DeriveA f1(int,int)"<<endl; }   //redefining
	void say() { cout<<"DeriveA say()"<<endl; }   //redefining
};

class DeriveB:public Base
{
public:
	void f1(int a) { cout<<"DeriveB f1(int)"<<endl; } //redefining
};

int main(){
	DeriveA a;
	Base *b=&a;
	b->exec();  //display():version of DeriveA call(polymorphism)
	            //say():version of Base called(allways )

	a.exec();        //same result as last statement
	a.say();
	//a.f1(1);         //error:no matching function, hidden !!
	DeriveB c;
	c.f1(1);         //version of DeriveB called

	return 0;
}
注意:C+++において、基本クラスに関数名が重載され、サブクラスにこの関数を再定義すると、基本クラスのすべてのバージョンが非表示になります.すなわち、サブクラスはサブクラスのみで定義され、ベースクラスはもう利用できなくなります.名前の隠し特性.