Salida del programa C++ | Conjunto 18

Prediga la salida de los siguientes programas C++.

Pregunta 1

#include <iostream>
using namespace std;
  
template <int N>
class A {
   int arr[N];
public:
   virtual void fun() { cout << "A::fun()"; }
};
  
class B : public A<2> {
public:
   void fun() { cout << "B::fun()"; }
};
  
class C : public B { };
  
int main() {
   A<2> *a = new C;
   a->fun();
   return 0;
}

Producción:

B::fun()

En general, el propósito de usar plantillas en C++ es evitar la redundancia de código. Creamos clases genéricas (o funciones) que se pueden usar para cualquier tipo de datos siempre que la lógica sea idéntica. El tipo de datos se convierte en un parámetro y se crea una instancia de clase/función en tiempo de compilación cuando se pasa un tipo de datos. Las plantillas de C++ también permiten elementos que no son de tipo (un parámetro que representa un valor, no un tipo de datos) como parámetros.
En el programa anterior, hay una clase genérica A que toma un parámetro N que no es de tipo. La clase B hereda de una instancia de la clase genérica A. El valor de N para esta instancia de A es 2. La clase B anula fun() de clase A<2>. La clase C hereda de B. En main(), hay un puntero ‘a’ de tipo A<2> que apunta a una instancia de C. Cuando se llama a ‘a->fun()’, la función de la clase B se ejecuta porque fun() es virtual y las funciones virtuales se llaman según el objeto real, no según el puntero. En la clase C, no existe la función ‘fun()’, por lo que se busca en la jerarquía y se encuentra en la clase B.

Pregunta 2

#include <iostream>
using namespace std;
  
template <int i>
int fun()
{
   i =20; 
}
  
int main() {
   fun<4>();
   return 0;
}

Producción:

 Compiler Error

El valor de los parámetros que no son de tipo debe ser constante, ya que se utilizan en tiempo de compilación para crear instancias de clases/funciones. En el programa anterior, templated fun() recibe un parámetro que no es de tipo e intenta modificarlo, lo cual no es posible. Por lo tanto, error del compilador.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *