Prediga la salida de los siguientes programas de C++.
Pregunta 1
C++
#include<iostream> using namespace std; class P { public: void print() { cout <<" Inside P::"; } }; class Q : public P { public: void print() { cout <<" Inside Q"; } }; class R: public Q { }; int main(void) { R r; r.print(); return 0; }
Salida:
dentro de Q
La función de impresión no está definida en la clase R. Por lo tanto, se busca en la jerarquía de herencia. print() está presente en ambas clases P y Q , ¿cuál de ellas debería llamarse? La idea es que, si hay herencia multinivel, la función se busca linealmente en la jerarquía de herencia hasta que se encuentra una función coincidente.
Pregunta 2
C++
#include<iostream> #include<stdio.h> using namespace std; class Base { public: Base() { fun(); //note: fun() is virtual } virtual void fun() { cout<<"\nBase Function"; } }; class Derived: public Base { public: Derived(){} virtual void fun() { cout<<"\nDerived Function"; } }; int main() { Base* pBase = new Derived(); delete pBase; return 0; }
Salida:
función base
Consulte el siguiente extracto del estándar C++ para obtener una explicación.
Cuando se llama a una función virtual directa o indirectamente desde un constructor (incluso desde el inicializador de mem para un miembro de datos) o desde un destructor, y el objeto al que se aplica la llamada es el objeto en construcción o destrucción, la función llamada es el una definida en la propia clase del constructor o destructor o en una de sus bases, pero no una función que la anule en una clase derivada de la clase del constructor o destructor, o que la anule en una de las otras clases base del objeto más derivado.
Debido a esta diferencia de comportamiento, se recomienda no invocar la función virtual del objeto mientras se construye o destruye. Vea esto para más detalles.
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