Prediga la salida de los siguientes programas de C++.
Pregunta 1
#include<iostream> using namespace std; class A { public: A(int ii = 0) : i(ii) {} void show() { cout << "i = " << i << endl;} private: int i; }; class B { public: B(int xx) : x(xx) {} operator A() const { return A(x); } private: int x; }; void g(A a) { a.show(); } int main() { B b(10); g(b); g(20); getchar(); return 0; }
Salida:
i = 10
i = 20
Dado que hay un constructor de conversión en la clase A, se puede asignar un valor entero a los objetos de la clase A y funciona la llamada a la función g(20). Además, hay un operador de conversión sobrecargado en la clase B, por lo que podemos llamar a g() con objetos de la clase B.
Pregunta 2
#include<iostream> using namespace std; class base { int arr[10]; }; class b1: public base { }; class b2: public base { }; class derived: public b1, public b2 {}; int main(void) { cout<<sizeof(derived); getchar(); return 0; }
Salida: si el entero ocupa 4 bytes, entonces 80.
Como b1 y b2 heredan de la clase base , hay dos copias de la clase base en la clase derivada . Este tipo de herencia sin virtual provoca despilfarro de espacio y ambigüedades. Las clases base virtuales se utilizan para ahorrar espacio y evitar ambigüedades en tales casos. Por ejemplo, el siguiente programa imprime 48. 8 bytes adicionales son para información de contabilidad almacenada por el compilador (consulte esto para obtener más detalles)
#include<iostream> using namespace std; class base { int arr[10]; }; class b1: virtual public base { }; class b2: virtual public base { }; class derived: public b1, public b2 {}; int main(void) { cout<<sizeof(derived); getchar(); return 0; }
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