継承中のリロード、書き換え、および対応する非表示ルール

1731 ワード

C++の継承で関数を書くとき、私たちの問題はリロード、書き換え、隠し関数の3つの問題に直面します.オブジェクト向けのプログラム設計では、この3つの概念の理解が重要です.そうしないと、奇妙なイベントが発生します.この3つの概念を説明します.
リロード:同じクラスで同じ関数名を宣言しますが、型パラメータリストのパラメータタイプとパラメータの数が異なると、リロードが発生します.
サンプルコード:
class A{
public://     ,     
	void f(){};
	void f(int a){};
	void f(double b){};
};

書き換え:すなわち、ベースクラスにvirualを宣言する関数であり、サブクラスは対応する関数を継承するが、独自の方法を実現する.書き換え(上書きとも呼ばれる)と呼ばれます.すなわち、サブクラスが同名の関数を呼び出す場合、呼び出されるのはベースクラスから書き換えられた関数であり、ベースクラスの関数実装でもある.書き換えは多態発生のメカニズムであり,ベースクラスにvirualキーワードを持つ関数をサブクラスで独自のバージョンを実現する.これを書き直しと言います.注意と隠す違い.
サンプルコード:
class A{
public:
	virtual void print(){
		cout<
このとき、Bオブジェクトのprintメソッドを呼び出すと、Bオブジェクト改造後のprint関数バージョンが実行されます.
隠し:これはC++の中で非常に特殊で、まさにこの規則の存在で、この3つの概念の難易度を一気に多く高めました.次のような用途があります.
1.ベースクラスの関数にvirualキーワードが存在しない場合、サブクラスが継承された後、定義された同名関数のパラメータリストのタイプと個数が同じかどうかにかかわらず、ベースクラスの名前関数は完全に非表示になります(この場合はリロードではないことに注意してください).このとき、サブクラスオブジェクトの関数を呼び出すと、サブクラスで定義されている関数しか呼び出されません(この関数はベースクラスの名前関数から継承されず、いわゆる書き換えではありません).
class A{
public:
	 void print(string s){
		cout<
の下には、ベースクラスにvirualキーワードコードが付いている例があります.この場合、サブクラスはベースクラスで継承されたvirual同名関数を書き換え、その後、ベースクラスと同名でパラメータタイプが異なる関数を定義します.
コードの例:
class A{
public:
	 virtual void print(string s){
		cout<B print(string s) //           
	b.print(1);        //right, ->B print(int a) 
}
注:呼び出されたb.print(「hello」)が正しく実行されます.しかし、サブクラスがベースクラスの同名virual関数を書き換えていない場合.このときb.print(「hello」)は成功しません.いわゆる隠れ現象を発見する.ベースクラスのvirual関数は、サブクラスに書き換えられていないが、サブクラスに定義も自分の同名の異なるパラメータタイプの関数がある場合、ベースクラスから継承された同名の関数はすべて隠され、自分が定義した関数だけが表示されます.次のコード例を見てください.エラーが発生します.
class A{
public:
	 virtual void print(string s){
		cout<B print(int a) 
}