Anulación de funciones de C++
Sustitución de funciones de C++
En este tutorial, aprenderemos sobre la anulación de funciones en C++ con la ayuda de ejemplos.
Como sabemos, la herencia es una característica de OOP que nos permite crear clases derivadas a partir de una clase base. Las clases derivadas heredan características de la clase base.
Supongamos que la misma función se define tanto en la clase derivada como en la clase basada. Ahora bien, si llamamos a esta función utilizando el objeto de la clase derivada, se ejecuta la función de la clase derivada.
Esto se conoce como anulación de funciones. en C++. La función en la clase derivada anula la función en la clase base.
Ejemplo 1:anulación de funciones de C++
// C++ program to demonstrate function overriding
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
derived1.print();
return 0;
}
Salida
Derived Function
Aquí, la misma función print()
se define en ambos Base
y Derived
clases.
Entonces, cuando llamamos a print()
del Derived
objeto derivado1 , el print()
de Derived
se ejecuta anulando la función en Base
.
Como podemos ver, la función se anuló porque llamamos a la función desde un objeto del Derived
clase.
Si hubiéramos llamado al print()
función de un objeto del Base
clase, la función no se habría anulado.
// Call function of Base class
Base base1;
base1.print(); // Output: Base Function
Acceder a la función anulada en C++
Para acceder a la función anulada de la clase base, usamos el operador de resolución de alcance ::
.
También podemos acceder a la función anulada usando un puntero de la clase base para apuntar a un objeto de la clase derivada y luego llamando a la función desde ese puntero.
Ejemplo 2:función anulada de acceso de C++ a la clase base
// C++ program to access overridden function
// in main() using the scope resolution operator ::
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1, derived2;
derived1.print();
// access print() function of the Base class
derived2.Base::print();
return 0;
}
Salida
Derived Function Base Function
Aquí, esta declaración
derived2.Base::print();
accede al print()
función de la clase Base.
Ejemplo 3:Función anulada de llamada C++ de clase derivada
// C++ program to call the overridden function
// from a member function of the derived class
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
// call overridden function
Base::print();
}
};
int main() {
Derived derived1;
derived1.print();
return 0;
}
Salida
Derived Function Base Function
En este programa, hemos llamado a la función anulada dentro del Derived
clase en sí.
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
Base::print();
}
};
Observe el código Base::print();
, que llama a la función anulada dentro del Derived
clase.
Ejemplo 4:Función anulada de llamada de C++ usando un puntero
// C++ program to access overridden function using pointer
// of Base type that points to an object of Derived class
#include <iostream>
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
// pointer of Base type that points to derived1
Base* ptr = &derived1;
// call function of Base class using ptr
ptr->print();
return 0;
}
Salida
Base Function
En este programa, hemos creado un puntero de Base
tipo llamado ptr . Este puntero apunta al Derived
objeto derivado1 .
// pointer of Base type that points to derived1
Base* ptr = &derived1;
Cuando llamamos al print()
función usando ptr , llama a la función anulada desde Base
.
// call function of Base class using ptr
ptr->print();
Esto se debe a que aunque ptr apunta a un Derived
objeto, en realidad es de Base
escribe. Entonces, llama a la función miembro de Base
.
Para anular el Base
función en lugar de acceder a ella, necesitamos usar funciones virtuales en el Base
clase.
Lenguaje C