C ++関数のオーバーロード、関数の再定義、および関数の書き換え

C ++の研究では、いくつかの概念を識別することは確かに避けられませんが、多くの場合、それは戸惑います。質問の鍵は、あなたがいくつかの詳細に気づいたかどうかです。

1つは、関数の過負荷(過負荷)

関数のオーバーロードとは何ですか?
実際、これはコンパイラのメカニズムと考えることができます。呼び出した関数は、関数の関連する特性に応じて自動的に照合され、一致する関数が自動的に選択されるため、この自動照合選択によって対応する関数が呼び出されます。このメカニズムは、関数のオーバーロードと呼ぶことができます。
どのように機能の過負荷を構成できますか?

関数のオーバーロードとは、クラス内で同じ名前でパラメーターリストが異なる複数の関数を宣言することです。これらのパラメーターの番号、順序、タイプは異なる場合がありますが、戻りタイプで判断することはできません。特徴は次のとおりです。
(1)同じスコープ(同じスコープ内);
(2)同じ関数名;
(3)異なるパラメーター;
(4)仮想キーワードはオプションです(注:関数の過負荷とかどうか仮想変更は何の関係もありません);
注:関数のオーバーロードは、戻り値のタイプとは関係ありません。

以下では、関数のオーバーロードをコードの形式で説明します(ここでは、クラスを使用して説明しませんでした。単純な関数の定義を使用して説明します)

void sum(int a, int b)
{
    
    
	cout << "调用了参数类型int,int函数" << endl;
	cout << a + b << endl;
}

void sum(int a, int b, int c)
{
    
    
	cout << "调用了参数类型int,int,int函数" << endl;
	cout << a + b + c << endl;
}

void sum(char a, char b)
{
    
    
	cout << "调用了参数类型char,char函数" << endl;
	cout << (int)a + (int)b << endl;
}

void sum(char a, int b)
{
    
    
	cout << "调用了参数类型char,int函数" << endl;
	cout << (int)a + b << endl;
}
void sum(int a, char b)
{
    
    
	cout << "调用了参数类型int,char函数" << endl;
	cout << a + (int)b << endl;
}
#include<iostream>
using namespace std;
//程序入口
int main()
{
    
    
	sum(3, 4);
	sum(3, 4, 5);
	sum('a', 'b');
	sum('a', 3);
	sum(3, 'a');
	return 0;
}

操作の結果を図に示し
ここに写真の説明を挿入
ます。操作の結果は明らかです。呼び出した関数の名前は明らかに同じですが、渡される実際のパラメーターの数、タイプ、および順序が異なるため、呼び出す関数も異なります。過負荷です。渡した実際のパラメータの種類、数、順序に応じて自動的に照合し、対応する関数を呼び出します。照合する関数がない場合は、エラーが報告されます。

次に、再定義(非表示とも呼ばれます)

==注:==私はVSコンパイルについて言及していません。エラーの内容は再定義です。この再定義は別の再定義ではありません。ここでの再定義は、関数の書き換えを指します。ここでは、クラスの概念を引用しました。クラスの概念について十分に理解していない場合は、他のブロガーに転送して、最初にクラスの概念を理解してから、再定義と書き換えを区別することができます。
関数の再定義とは何ですか?
(1)同じスコープにない(それぞれ派生クラスと基本クラスにある);
(2)関数名が同じである;
(3)戻り値が異なる可能性がある;
(4)パラメーターが異なる このとき、仮想キーワードの有無にかかわらず、基本クラスの機能は非表示になります
オーバーロードや上書きと混同しないように注意してください)。(5)パラメータは同じですが、基本クラスの機能には仮想キーワードがありません。このとき、基本クラスの機能は非表示になっています(カバレッジと混同しないように注意してください)。

#include<iostream>
using namespace std;
//基类
class Base
{
    
    
public:
	void Show()//无参
	{
    
    
		cout << "调用了基类Base类Show方法" << endl;
	}
private:

};
//派生类CA继承于Base类
class CA:public Base
{
    
    
public:
	void Show()//无参
	{
    
    
		cout << "调用了CA类Show方法" << endl;
	}

private:

};
//派生类CB集成与Base类
class CB:public Base
{
    
    
public:
	void Show(int i)//含参
	{
    
    
		cout << "调用了CB类Show方法" << endl;
	}
private:

};

//程序入口
int main()
{
    
    

	Base base;					//创建一个Base类对象
	base.Show();				//调用Show方法
	CA ca;						//创建一个Base类对象
	ca.Show();					//调用Show方法
	CB cb;						//创建一个Base类对象
	cb.Show(1);					//调用Show方法
	return 0;
}

操作結果:
ここに写真の説明を挿入
ご覧のとおり、Show()メソッドは元の基本クラス基本クラスに存在します。
派生CAクラスでShowメソッドを定義しなかったとすると、クラスオブジェクトcaは基本クラスのメンバーメソッドを呼び出す必要があります。特定の実装では、CAクラスのShowメソッドを直接コメントアウトして実行できますが、ここでは実装しません。アップ。
ただし、ここでは、派生クラスCAのShowメソッドを再定義して、基本クラスのShowメソッドを非表示にします。次に、クラスオブジェクトcaは、書き換えたShowメソッドを呼び出すため、クラスオブジェクトcaはCAを呼び出します。クラスのメソッドを表示します。
次に、CBクラスもShowメソッドを書き換えるため、基本クラスのShowメソッドも非表示になります。現時点では、CBクラスオブジェクトcbはパラメーターなしでShowメソッドを呼び出すことはできず、cbはShow( int i)メソッド。
これは関数の再定義です

3、書き直し(オーバーライドとも呼ばれます)

関数の書き換えとは、サブクラスが基本クラスの仮想関数を再定義することを意味します。機能は次のとおりです。

(1)同じスコープにない(それぞれ派生クラスと基本クラスにある);
(2)関数名が同じである;
(3)パラメーターが同じである;
(4)基本クラス関数に静的ではなく仮想キーワードが必要です。
(5)戻り値は同じです。そうでない場合、エラーが報告されます。
(6)書き換えられた関数のアクセス修飾子が異なる場合があります。

過負荷とカバレッジの違い:

(1)オーバーライドは、サブクラスと親クラスの間の関係であり、垂直関係です。オーバーロードは、同じクラス内の異なるメソッド間の関係であり、水平関係です。

(2)オーバーライドには同じパラメーターリストが必要であり、オーバーロードには異なるパラメーターリストが必要です。オーバーライドには同じリターンタイプが必要ですが、オーバーロードには必要ありません。

(3)カバレッジ関係では、呼び出し元のメソッド本体はオブジェクトの種類(基本クラスタイプまたは派生クラスタイプ)に応じて決定され、オーバーロード関係は呼び出し時の実際のパラメータリストと仮パラメータリストに基づいてメソッド本体を選択します。

#include<iostream>
using namespace std;
//基类
class Base
{
    
    
public:
	virtual void Show(int a,int b)
	{
    
    
		cout << "调用了基类Base类Show方法并输出了两位数:"<<a<<","<<b << endl;
	}
private:

};
//派生类
class CA:public Base
{
    
    
public:
	void Show(int a, int b)
	{
    
    
		cout << "调用了基类CA类Show方法并输出了两位数:" << a << "," << b << endl;
	}

private:

};

//程序入口
int main()
{
    
    

	Base base;					//创建一个Base类对象
	base.Show(3,4);				//调用Show方法
	CA ca;						//创建一个Base类对象
	ca.Show(5,6);					//调用Show方法
	
	return 0;
}

動作結果:
ここに写真の説明を挿入
注:カバレッジ関係では、呼び出しメソッド本体はオブジェクトのタイプ(基本クラスタイプまたは派生クラスタイプ)に応じて決定され、オーバーロード関係は、メソッド本体を選択するための呼び出し時の実際のパラメーターリストと正式なパラメーターリストに基づいています。
言い換えると、関数を呼び出すときに呼び出される関数は、クラスオブジェクトのタイプによって異なります。このクラスのオブジェクトのタイプが基本クラスの場合、基本クラスのメンバー関数を呼び出します。このクラスのオブジェクトのタイプが派生クラスであり、派生クラスが基本クラスのメンバー関数を上書きする場合、派生クラスのクラスオブジェクトは次のようになります。書き換え後、同名のメンバー関数を呼び出します。

C ++の学習に関しては、誰もが私をフォローすることを歓迎し、ブックマークなどの私の記事にコメントし、迷子にならないようにフォローしてください。ネチズンも私とC ++乾物について話し合うことを歓迎します。C ++の知識はそれだけではありません。1つずつ分析して説明します。ネチズンが私に説明してほしいと思ったら、コメントしてメッセージを残すことができます。私はそれをみんなに説明するために最善を尽くします。

:: ProMer_Wang

リンク:https://blog.csdn.net/qq_43801020/article/details/106851972

この記事はProMer_Wangのオリジナル記事であり、著作権は作者に帰属します。再印刷するための元のテキストのソースを示してください。再印刷へようこそ!

おすすめ

転載: blog.csdn.net/qq_43801020/article/details/106851972