Back
Close

Herencia en C++ (Práctica 3)

camilocorreaUdeA
1,009 views

Herencia virtual

Visualice una situación en la que hay herencia híbrida dada por la combinanción de herencia jerárquica, herencia múltiple y herencia multinivel. En dicha situación dos clases B y C heredan de una clase A, y a su vez una clase D hereda de las clases B y C al tiempo. La situación puede observarse en el siguiente gráfico y en el siguiente coódigo de ejemplo.Por favor ejecutelo y observe el resultado al final de la ejecución.

Image of Yaktocat

#include<iostream>
using namespace std;
class A
{
public:
void unMetodoX(){cout<<"Soy de la clase A"<<endl;}
};
class B: public A
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Como puede observar el código ha sido compilado pero en tiempo de ejecución la llamada al método "unMetodoX" es ambigua ya que la clase D lo hereda directamente de B y C, pero también a través de esas clases lo hereda de la clase A. De modo que no sabe cuál de los 3 debería ejecutar. Esta es una situación poco común en una aplicación real desarrollada en C++ ya que los cánones de buenas prácticas de programación sugieren que se evite a toda costa la herencia múltiple, de hecho otros lenguajes de programación orientada a objetos como por ejemplo Java no permiten implementar herencia múltiple. Pero en caso de que por alguna razón se vea obligado a implmentar una estructura jerárquica de ese tipo se sugiere el uso de la palabra reservada virtual en la herencia de las clases intermedias B y C. Lo anterior corrige el problema de la ambigüedad y ya no se dará el error y se ejecutará el método heredado desde la clase A.

#include<iostream>
using namespace std;
class A
{
public:
void unMetodoX(){cout<<"Soy de la clase A"<<endl;}
};
class B: virtual public A /* Agregando 'virtual' a la herencia de las clases derivadas intermedias */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Considere que se implementó la herencia virtual para evitar el problema de ambigüedad, luego responda a las siguientes inquietudes:

¿Qué pasa cuándo una de las dos clases derivadas intermedias, B o C, (pero no las dos al tiempo) redefine el método unMetodoX?
¿Qué pasa cuándo ambas clases B y C redefinen el método unMetodoX?
Create your playground on Tech.io
This playground was created on Tech.io, our hands-on, knowledge-sharing platform for developers.
Go to tech.io
codingame x discord
Join the CodinGame community on Discord to chat about puzzle contributions, challenges, streams, blog articles - all that good stuff!
JOIN US ON DISCORD
Online Participants