Sobrecarga de funciones de C ++, redefinición de funciones y reescritura de funciones

En el estudio de C ++, sin duda es inevitable discriminar algunos conceptos, pero muchas veces quedan perplejos. La clave de la pregunta es si ha notado algunos detalles.

Uno, sobrecarga de funciones (sobrecarga)

¿Qué es la sobrecarga de funciones?
De hecho, podemos pensar en esto como un mecanismo del compilador. Este emparejará automáticamente la función que llame de acuerdo con las características relevantes de la función, y seleccionará automáticamente la función de coincidencia, de modo que esta selección de coincidencia automática llamará a la función correspondiente El mecanismo, podemos llamarlo función de sobrecarga.
¿Cómo puede constituir una sobrecarga funcional?

La sobrecarga de funciones se refiere a la declaración de múltiples funciones con el mismo nombre pero diferentes listas de parámetros en una clase. Estos parámetros pueden tener diferentes números, órdenes y tipos, pero no pueden ser juzgados por el tipo de retorno. Las características son:
(1) el mismo alcance (en el mismo alcance);
(2) el mismo nombre de función;
(3) diferentes parámetros;
(4) la palabra clave virtual es opcional (nota: función sobrecarga y si la modificación virtual no tiene nada que ver);
Nota: la sobrecarga de funciones no tiene nada que ver con el tipo de valor de retorno

A continuación, explicaré la sobrecarga de funciones en forma de código: (No usé la clase para explicar aquí, solo use la definición de funciones simples para explicar)

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;
}

Los resultados de la operación se muestran en la figura:
Inserte la descripción de la imagen aquí
Los resultados de la operación son obvios. Puede observar que la función que llamé obviamente tiene el mismo nombre, pero debido a que el número, tipo y orden de los parámetros reales pasados ​​son diferentes, las funciones que llama son diferentes. Es sobrecargado. El sistema coincidirá automáticamente de acuerdo con el tipo, número y orden de los parámetros reales que ingrese, y llamará a la función correspondiente. Si no hay una función coincidente, se informará un error.

En segundo lugar, redefinir (también conocido como ocultar)

== Nota: == No me refiero a la compilación VS, el contenido del error es una redefinición, esta redefinición no es otra redefinición, la redefinición aquí se refiere a la reescritura de la función. Aquí he citado el concepto de clases. Si no sabe lo suficiente sobre el concepto de clases, puede transferirlo a otros bloggers para que comprendan el concepto de clases primero y luego distinguir entre redefinición y reescritura.
¿Cuál es la redefinición de la función?
(1) No en el mismo ámbito (en la clase derivada y la clase base respectivamente);
(2) El nombre de la función es el mismo;
(3) El valor de retorno puede ser diferente;
(4) Los parámetros son diferentes. En este momento, independientemente de si hay una palabra clave virtual, la función de la clase base estará oculta (tenga cuidado de no confundirse con sobrecarga y sobrescritura);
(5) Los parámetros son los mismos, pero la función de la clase base no tiene la palabra clave virtual. En este momento, la función de la clase base está oculta (tenga cuidado de no confundirla con cobertura);

#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;
}

Resultado de la operación: como
Inserte la descripción de la imagen aquí
puede ver, el método Show () existe en la clase base original Clase base.
Suponiendo que no definí el método Show en la clase CA derivada, el objeto de clase ca debe llamar al método miembro de la clase base. Para una implementación específica, puede comentar directamente el método Show en la clase CA y ejecutarlo, no lo implementaré aquí. Arriba.
Pero aquí, redefiní el método Show en la clase derivada CA, por lo que el método Show de la clase base está oculto. Luego, el objeto de clase ca llamará al método Show que ha reescrito, por lo que el objeto de clase ca llama a CA. Muestre el método de la clase.
En segundo lugar, la clase CB también reescribe el método Show, por lo que el método Show de la clase base también está oculto. En este momento, el objeto de la clase CB cb no puede llamar al método Show sin parámetros, y cb solo puede llamar al método Show ( int i) método.
Esta es la redefinición de la función

Tres, reescribir (también conocido como anular)

La reescritura de funciones significa que la subclase redefine la función virtual de la clase base. Las características son:

(1) No en el mismo ámbito (respectivamente en la clase derivada y la clase base);
(2) El nombre de la función es el mismo;
(3) Los parámetros son los mismos;
(4) La función de la clase base debe tener la palabra clave virtual, no estática.
(5) El valor devuelto es el mismo, de lo contrario se informará un error;
(6) El modificador de acceso de la función reescrita puede ser diferente;

La diferencia entre sobrecarga y cobertura:

(1) La anulación es la relación entre la subclase y la clase principal, que es una relación vertical; la sobrecarga es la relación entre diferentes métodos en la misma clase, que es una relación horizontal;

(2) La anulación requiere la misma lista de parámetros y la sobrecarga requiere listas de parámetros diferentes; la anulación requiere el mismo tipo de retorno, pero la sobrecarga no requiere;

(3) En la relación de cobertura, el cuerpo del método de llamada se determina de acuerdo con el tipo de objeto (tipo de clase base o tipo de clase derivada), y la relación de sobrecarga se basa en la lista de parámetros real y la lista de parámetros formales en el momento de la llamada para seleccionar el cuerpo del método.

#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;
}

resultado de la operación:
Inserte la descripción de la imagen aquí
Nota: En la relación de cobertura, el cuerpo del método de llamada se determina según el tipo de objeto (tipo de clase base o tipo de clase derivada), y la relación de sobrecarga se basa en la lista de parámetros real y la lista de parámetros formales en el momento de la llamada para seleccionar el cuerpo del método.
En otras palabras: cuando se llama a una función, qué función se llama depende del tipo de objeto de la clase. Si el tipo del objeto de esta clase es una clase base, llame a la función miembro de la clase base. Si el tipo del objeto de esta clase es una clase derivada, y la clase derivada sobrescribe la función miembro de la clase base, entonces el objeto de clase de la clase derivada es Llamará a la función miembro del mismo nombre después de reescribir.

En cuanto al aprendizaje de C ++, invitamos a todos a seguirme, comentar mis artículos, me gusta, marcar como favorito, seguirme para no perderse. Los internautas también pueden hablar conmigo sobre productos secos de C ++. El conocimiento de C ++ es mucho más que eso, lo analizaremos y explicaremos uno a uno. Si los internautas quieren que les explique, pueden comentar y dejar un mensaje, y haré todo lo posible para explicárselo a todos.

: : ProMer_Wang

Enlace: https://blog.csdn.net/qq_43801020/article/details/106851972

Este artículo es el artículo original de ProMer_Wang, los derechos de autor pertenecen al autor, indique la fuente del texto original para la reimpresión, ¡bienvenido a reimprimir!

Supongo que te gusta

Origin blog.csdn.net/qq_43801020/article/details/106851972
Recomendado
Clasificación