¿Cuáles son las diferencias entre sobrecarga, anulación (también llamada "anulación") y redefinición (también llamada "oculta") en C++?

En C++, se permiten múltiples definiciones para una función y un operador en el mismo alcance, lo que se denomina sobrecarga de funciones y sobrecarga de operadores respectivamente.

Una declaración sobrecargada es una declaración con el mismo nombre que una función o método que ha sido declarado previamente en el alcance, pero su lista de parámetros y su definición (implementación) son diferentes.

Cuando se llama a una función u operador sobrecargado, el compilador determina la definición más apropiada comparando los tipos de parámetros utilizados con los tipos de parámetros en la definición. El proceso de seleccionar la función u operador sobrecargado más apropiado se denomina toma de decisiones de sobrecarga.

La importancia de la sobrecarga en la programación en C++ es evidente, sin embargo, los entrevistadores a menudo preguntan no sólo sobre la sobrecarga, sino también sobre la reescritura y la redefinición. Esto deja a muchos entrevistadores confusos.

Por eso hoy vamos a hablar de la diferencia entre sobrecargar, reescribir y redefinir.

1. Revisión de conceptos

(1) Sobrecarga

La sobrecarga se divide en dos tipos, uno es la sobrecarga de funciones y el otro es la sobrecarga del operador.

Generalmente se refiere a la sobrecarga de funciones, es decir, varias funciones con el mismo nombre (es decir, varias funciones tienen el mismo nombre) con diferentes listas de parámetros (diferentes tipos de parámetros, números y órdenes) declarados en el mismo alcance, pero el número de Los parámetros son los mismos. Los tipos son diferentes (el número y el tipo son los mismos, pero un orden diferente está bien), y luego la lista de parámetros determina qué función llamar.
Características:
①La consideración principal aquí es la orientación a objetos. En la orientación a objetos, la sobrecarga solo existe dentro de la clase, es decir, en la misma clase. Si abandona la orientación a objetos, manténgase en el mismo alcance.
②El nombre de la función es el mismo pero la lista de parámetros es diferente.③La
sobrecarga no se preocupa por el tipo de retorno de la función y no puede juzgarse por el tipo de retorno.

class A
{
    
    
	public:
  		void test(int i);
  		void test(double i);			//overload
  		void test(int i, double j);		//overload
  		void test(double i, int j);		//overload
};

(2) Reescritura (también llamada "sobrescritura")

Indica que hay una función de clase base redefinida en la clase derivada.
Características:
① El nombre de la función, la lista de parámetros y el tipo de valor de retorno deben ser consistentes con la función anulada en la clase base, solo el cuerpo de la función es diferente (dentro de las llaves). ②Cuando
se llama una clase derivada, se llamará a la función anulada de la clase derivada, pero no se llamará a la función anulada.
③La función anulada en la clase base anulada debe modificarse mediante virtual.

#include<iostream>
using namespace std;

//基类
class Base
{
    
    
public:
    virtual void fun(int i){
    
     
        cout << "Base::fun(int) : " << i << endl;
    }
};

//派生类
class Derived : public Base
{
    
    
public:
    virtual void fun(int i){
    
     
        cout << "Derived::fun(int) : " << i << endl;
    }
};

int main()
{
    
    
    Base b;
    Base * pb = new Derived();
    pb->fun(3);				//Derived::fun(int)

    system("pause");
    return 0;

}

(3) Redefinición (también llamada "ocultar")

Indica que una función de clase derivada bloquea una función de clase base con el mismo nombre.
Características:
①Los nombres de las funciones son los mismos, pero los valores de retorno pueden ser diferentes.
②El alcance está ubicado en la clase base y la clase derivada respectivamente;
Nota:
①Si la función de la clase derivada y la función de la clase base tienen el mismo nombre, pero los parámetros son diferentes, en este momento, independientemente de si hay virtual o no, la función de la clase base está oculta.
② Si la función de la clase derivada tiene el mismo nombre que la función de la clase base y los parámetros también son los mismos, pero la función de la clase base no tiene la palabra clave visual, entonces la función de la clase base está oculta.
Por lo tanto, aquí solo se requiere la función con el mismo nombre, independientemente de si la lista de parámetros es la misma, la función de clase base estará oculta.

class A
{
    
    
public:
	void fun()
	{
    
    
		cout<<"A"<<endl;
	}
    
    virtual void fun1(int i,int j)
 	{
    
    
 		cout << "A::fun() : " <<i<<" "<<j<<endl;
 	}
};

class B:public A
{
    
    
public:
    //两个函数参数相同,但基类函数不是虚函数。
	void fun() //隐藏父类的 fun 函数
	{
    
    
		cout<<"B"<<endl;
	}
    
    //两个函数参数不同,无论基类函数是否是虚函数,基类函数都会被屏蔽。
    virtual void fun1(double i) //重写基类A中的fun1()
	{
    
    
		cout << "B::fun(): " << i << endl;
	}
}

int main()
{
    
    
 B b;
 b.fun3(5);
 //b.fun3(1, 2);隐藏了基类的同名函数,所以不能运行
 return 0;
}

2. Comparación de diferencias

(1) La diferencia entre sobrecargar y reescribir:

​①La diferencia en el alcance: uno está en la misma clase y el otro está en una clase diferente (orientada a objetos).

Es decir, sobrecarga significa que el nombre de la función es el mismo pero la lista de parámetros es diferente. La sobrecarga solo existe dentro de la clase; anular significa que la subclase redefine la función virtual con el mismo nombre y parámetros en la clase principal. Las características de la función son Lo mismo, pero la implementación específica es diferente. La razón principal es que el nombre de la función es el mismo y la lista de parámetros es diferente. Aparece en la relación de herencia. Por lo tanto, las funciones sobrecargadas y sobrecargadas están en la misma clase; las funciones anuladas y anuladas están en clases diferentes, es decir, en la clase base y la clase derivada respectivamente.

②Diferencia en los parámetros: una lista de parámetros debe ser diferente y la otra lista de parámetros debe ser la misma.

Es decir, las listas de parámetros de funciones sobrecargadas y sobrecargadas deben ser diferentes, y las listas de parámetros de funciones anuladas y reescritas deben ser las mismas.

​③La diferencia entre virtual: uno puede tener modificación virtual o no; el otro debe tener modificación virtual.

Es decir, la función sobrecargada y la función sobrecargada pueden modificarse mediante virtual o no, y la clase base anulada debe modificarse mediante virtual.
(2) La diferencia entre sobrecarga, reescritura oculta y:

​①Diferencia de alcance: el alcance de la sobrecarga está en la misma clase; la función anulada y la función anulada, la función oculta y la función oculta están todas en clases diferentes. ​ ②La diferencia en los parámetros: las listas de parámetros de la función oculta y la función oculta pueden ser iguales o diferentes, pero los nombres de las funciones deben ser los mismos; cuando los parámetros son diferentes, la función de clase base se ocultará independientemente de si La función en la clase base se modifica virtualmente o no, en lugar de reescribirse.

Resumir:

Por lo tanto, si desea distinguir estos tres conceptos, puede prestar atención a las diferencias esenciales entre sus conceptos y luego realizar una comparación detallada de las diferencias en términos de alcance, parámetros, etc., para completar un resumen de las diferencias.

Supongo que te gusta

Origin blog.csdn.net/qq_52302919/article/details/132307340
Recomendado
Clasificación