Prediga la salida de los siguientes programas C++.
Pregunta 1
#include<iostream> using namespace std; class Test1 { int x; public: void show() { } }; class Test2 { int x; public: virtual void show() { } }; int main(void) { cout<<sizeof(Test1)<<endl; cout<<sizeof(Test2)<<endl; return 0; }
Salida:
4
8
Solo hay una diferencia entre Test1 y Test2. show() no es virtual en Test1, pero es virtual en Test2. Cuando hacemos una función virtual, el compilador agrega un puntero adicional vptr a los objetos de la clase. El compilador hace esto para lograr el polimorfismo en tiempo de ejecución (consulte el capítulo 15 del libro Thinking in C++ para obtener más detalles). El puntero adicional vptr se suma al tamaño de los objetos, por eso obtenemos 8 como tamaño de Test2.
Pregunta 2
#include<iostream> using namespace std; class P { public: virtual void show() = 0; }; class Q : public P { int x; }; int main(void) { Q q; return 0; }
Salida: Error del compilador
Obtenemos el error porque no podemos crear objetos de clases abstractas. P es una clase abstracta ya que tiene un método virtual puro. La clase Q también se vuelve abstracta porque se deriva de P y no implementa show().
Escriba comentarios si encuentra que alguna de las respuestas/explicaciones es incorrecta, o si desea compartir más información sobre los temas discutidos 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