C ++ 함수 오버로딩, 함수 재정의 및 함수 재 작성

C ++ 연구에서 일부 개념을 구별하는 것은 확실히 불가피하지만 종종 당황스러워합니다. 질문의 핵심은 몇 가지 세부 사항을 발견했는지 여부입니다.

하나, 기능 과부하 (과부하)

함수 과부하 란 무엇입니까?
사실 우리는 이것을 컴파일러의 메커니즘이라고 생각할 수 있는데, 함수의 관련 특성에 따라 호출하는 함수를 자동으로 일치시키고 일치하는 함수를 자동으로 선택하므로이 자동 일치 선택은 해당 함수를 호출합니다. 이 메커니즘은 함수 오버로딩이라고 부를 수 있습니다.
함수 과부하를 어떻게 구성 할 수 있습니까?

함수 오버로딩은 클래스에서 이름은 같지만 매개 변수 목록이 다른 여러 함수를 선언하는 것을 말합니다. 이러한 매개 변수는 번호, 순서 및 유형이 다를 수 있지만 반환 유형으로 판단 할 수 없습니다. 특성은 다음과 같습니다.
(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 () 메서드는 원래 기본 클래스 Base 클래스에 있습니다.
파생 된 CA 클래스에서 Show 메서드를 정의하지 않았다고 가정하면 클래스 개체 ca는 기본 클래스의 멤버 메서드를 호출해야합니다. 특정 구현의 경우 CA 클래스에서 Show 메서드를 직접 주석 처리하여 실행할 수 있습니다. 여기서 구현하지 않겠습니다. 쪽으로.
하지만 여기서는 파생 클래스 CA에서 Show 메서드를 재정의하므로 기본 클래스의 Show 메서드가 숨겨져 있고 ca 클래스 개체가 다시 작성한 Show 메서드를 호출하므로 ca 클래스 개체가 CA를 호출합니다. 클래스의 표시 방법.
둘째, CB 클래스도 Show 메서드를 다시 작성하므로 기본 클래스 Show 메서드도 숨겨져 있습니다. 이때 CB 클래스 객체 cb는 매개 변수없이 Show 메서드를 호출 할 수 없으며 cb는 Show () 만 호출 할 수 있습니다. int i) 방법.
이것이 기능 재정의입니다.

셋, 다시 쓰기 (오버라이드라고도 함)

함수 재 작성은 하위 클래스가 기본 클래스의 가상 기능을 재정의하는 것을 의미합니다. 기능은 다음과 같습니다.

(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 ++에 대한 지식은 그 이상이므로 하나씩 분석하고 설명하겠습니다. 네티즌들이 설명 해달라고하면 댓글을 달고 메시지를 남길 수 있고, 최선을 다해 설명해 드리겠습니다.

: : ProMer_Wang

링크 : https://blog.csdn.net/qq_43801020/article/details/106851972

이 기사는 ProMer_Wang의 원본 ​​기사이며, 저작권은 작성자에게 있습니다. 원문의 출처를 표시하여 재 인쇄, 재 인쇄를 환영합니다!

추천

출처blog.csdn.net/qq_43801020/article/details/106851972