Clase base virtual en C++

Las clases base virtuales se utilizan en la herencia virtual para evitar que aparezcan múltiples «instancias» de una clase determinada en una jerarquía de herencia cuando se utilizan herencias múltiples.

Necesidad de clases base virtuales: Considere
la situación en la que tenemos una clase A. Esta clase A es heredada por otras dos clases B y C. Ambas clases se heredan en otra en una nueva clase D como se muestra en la figura a continuación.

Como podemos ver en la figura, los miembros de datos/funciones de la clase A se heredan dos veces a la clase D. Uno a través de la clase B y el segundo a través de la clase C. Cuando un objeto de la clase D accede a cualquier miembro de datos/función de la clase A , surge la ambigüedad en cuanto a qué miembro de datos/función se llamaría. Uno heredado a través de B o el otro heredado a través de C. Esto confunde al compilador y muestra un error.

Ejemplo: para mostrar la necesidad de una clase base virtual en C++

#include <iostream>
using namespace std;
  
class A {
public:
    void show()
    {
        cout << "Hello form A \n";
    }
};
  
class B : public A {
};
  
class C : public A {
};
  
class D : public B, public C {
};
  
int main()
{
    D object;
    object.show();
}

Errores de compilación:

prog.cpp: In function 'int main()':
prog.cpp:29:9: error: request for member 'show' is ambiguous
  object.show();
         ^
prog.cpp:8:8: note: candidates are: void A::show()
   void show()
        ^
prog.cpp:8:8: note:                 void A::show()

Cómo resolver este problema?
Para resolver esta ambigüedad cuando la clase A se hereda tanto en la clase B como en la clase C , se declara como clase base virtual colocando una palabra clave virtual como:

Sintaxis para Clases Base Virtuales:

Syntax 1:
class B : virtual public A 
{
};

Syntax 2:
class C : public virtual A
{
};

Nota: virtual puede escribirse antes o después de público . Ahora solo se copiará una copia del miembro de función/datos a la clase C y la clase B y la clase A se convierte en la clase base virtual.
Las clases base virtuales ofrecen una forma de ahorrar espacio y evitar ambigüedades en las jerarquías de clases que usan herencias múltiples. Cuando una clase base se especifica como base virtual, puede actuar como base indirecta más de una vez sin duplicación de sus miembros de datos. Todas las clases base que usan la base virtual comparten una sola copia de sus miembros de datos.

Ejemplo 1

#include <iostream>
using namespace std;
  
class A {
public:
    int a;
    A() // constructor
    {
        a = 10;
    }
};
  
class B : public virtual A {
};
  
class C : public virtual A {
};
  
class D : public B, public C {
};
  
int main()
{
    D object; // object creation of class d
    cout << "a = " << object.a << endl;
  
    return 0;
}
Producción:

a = 10

Explicación: la clase A tiene solo un miembro de datos a que es público . Esta clase se hereda virtualmente en la clase B y la clase C. Ahora la clase B y la clase C se convierten en una clase base virtual y no se realiza ninguna duplicación del miembro de datos a .

Ejemplo 2:

#include <iostream>
using namespace std;
  
class A {
public:
    void show()
    {
        cout << "Hello from A \n";
    }
};
  
class B : public virtual A {
};
  
class C : public virtual A {
};
  
class D : public B, public C {
};
  
int main()
{
    D object;
    object.show();
}
Producción:

Hello from A

Publicación traducida automáticamente

Artículo escrito por gyanendra371 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 *