C++ | Herencia | Pregunta 12

#include<iostream>
using namespace std;
  
class Base
{
protected:
    int a;
public:
    Base() {a = 0;}
};
  
class Derived1:  public Base
{
public:
    int c;
};
  
  
class Derived2:  public Base
{
public:
    int c;
};
  
class DerivedDerived: public Derived1, public Derived2
{
public:
    void show()  {   cout << a;  }
};
  
int main(void)
{
    DerivedDerived d;
    d.show();
    return 0;
}

(A) Error del compilador en la línea «cout << a;»
(B) 0
(C) Error del compilador en la línea «class DerivedDerived: public Derived1, public Derived2»

Respuesta: (A)
Explicación: Este es un ejemplo típico de problema de diamantes de herencia múltiple . Aquí, el miembro de la clase base ‘a’ se hereda a través de Derived1 y Derived2 . Por lo tanto, hay dos copias de ‘a’ en DerivedDerived que hacen la declaración «cout << a;» ambiguo.

La solución en C++ es usar clases base virtuales. Por ejemplo, el siguiente programa funciona bien e imprime

#include<iostream>
usando el espacio de nombres estándar;

clase Base
{
protegida:
int a;
público:
Base() {a = 0;}
};

clase Derivada1: base pública virtual
{
pública:
int c;
};

clase Derivada2: base pública virtual
{
pública:
int c;
};

clase DerivadaDerivada: pública Derivada1, pública Derivada2
{
pública:
void show() { cout << a; }
};

int main(void)
{
DerivadoDerivado d;
d.mostrar();
devolver 0;
}

Cuestionario de esta pregunta

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 *