Los argumentos predeterminados son los valores proporcionados durante la declaración de la función, de modo que los valores se pueden asignar automáticamente si no se les pasa ningún argumento. En caso de que se pase algún valor, el valor predeterminado se anula y se convierte en un argumento parametrizado.
La función virtual es una función miembro que se declara dentro de una clase base y se redefine (anulada) por una clase derivada. Cuando hace referencia a un objeto de clase derivada mediante un puntero o una referencia a la clase base, puede llamar a una función virtual para ese objeto y ejecutar la versión de la función de la clase derivada. Una función virtual también se incluye en el polimorfismo de tiempo de ejecución.
Para ver la aplicación combinada de argumentos por defecto con funciones virtuales tomemos una muestra
Ejemplo:
CPP
// C++ program to demonstrate how default arguments // and virtual function are used together #include <iostream> using namespace std; // Initialization of base class class Base { public: // Initialization of virtual function virtual void fun(int x = 0) { cout << "Base::fun(), x = " << x << endl; } }; // Initialization of Derived class class Derived : public Base { public: // NOTE this virtual function will take an argument // But haven't initialized yet virtual void fun(int x) { cout << "Derived::fun(), x = " << x << endl; } }; // Driver Code int main() { Derived d1; // Constructor // Base class pointer which will // Edit value in memory location of // Derived class constructor Base* bp = &d1; bp->fun(); // Calling a derived class member function return 0; // Returning 0 means the program // Exectued successfully }
Producción:
Derived::fun(), x = 0
Si echamos un vistazo más de cerca a la salida, observamos que se llama a la función ‘ fun() ‘ de la clase derivada, y se usa el valor predeterminado de la función ‘ fun() ‘ de la clase base.
Los argumentos predeterminados no participan en la firma (nombre, tipo y orden de la función) de las funciones. Por lo tanto, las firmas de la función ‘ fun() ‘ en la clase base y la clase derivada se consideran iguales, por lo tanto, se anula la función ‘ fun() ‘ de la clase base . Además, el valor predeterminado se usa en tiempo de compilación. Cuando el compilador ve que falta un argumento en una llamada de función, sustituye el valor predeterminado dado. Por lo tanto, en el programa anterior, el valor de x se sustituye en tiempo de compilación, y en tiempo de ejecución se llama a la función ‘ fun() ‘ de la clase derivada.
Ejemplo:
CPP
// C++ program To demonstrate how default arguments // and virtual function are used together #include <iostream> using namespace std; class Base { public: virtual void fun(int x = 0) { cout << "Base::fun(), x = " << x << endl; } }; class Derived : public Base { public: virtual void fun(int x = 10) // NOTE THIS CHANGE { cout << "Derived::fun(), x = " << x << endl; } }; int main() { Derived d1; // Constructor // Base class pointer which will // Edit value in memory location of // Derived class constructor Base* bp = &d1; bp->fun(); // Calling a derived class member function return 0; // Returning 0 means the program // Exectued successfully }
Derived::fun(), x = 0
La salida de este programa es la misma que la del programa anterior. El motivo es el mismo, el valor predeterminado se sustituye en tiempo de compilación. Fun() se llama en ‘bp’, que es un puntero de tipo Base. Entonces el compilador sustituye 0 (no 10).
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA