Problema na Classe Base Virtual C++

Então, eu estava navegando em vários fóruns e me deparei com esta pergunta que acho que ninguém respondeu corretamente, então estou postando aqui. Uma classe base virtual é apresentada para superar o “temido diamante da morte”/problema de ambigüidade na herança múltipla.

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

O que acontecerá quando uma palavra-chave virtual não for usada na declaração da classe C. Você poderia por favor me explicar em detalhes?

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};

@romulopb consegue dar uma luz?

Esse problema se deve especificamente a natureza de C++ e como herança foi projetado internamente na linguagem. Sem virtual você acaba tendo 2 cópias em memória da classe A, inclusive dos atributos…

Se o polimorfismo em certo momento levar a execução do lado da classe C, as características de A não seriam as mesmas que se encontram na memória de B, logo digamos uma mesma variável bar, poderia estar em um estado diferente seguindo esse fluxo, de bar se você tentar usar foo de B.

É importante entender que não necessariamente foo() vai gerar sempre erros ou inconsistências, é um problema realmente complicado de entender e o código usado como exemplo não tem contexto suficiente, idealmente em um bom exemplo B ou C ou ambos sobrescreveriam foo() para explicitar como o polimorfismo pode levar o programa a escolher uma cópia ou outra de A. Se ainda estiver em dúvida, posse tentar elaborar melhor.

3 curtidas

A herança virtual existe basicamente para resolver o problema de ambiguidade ao utilizar heranças múltiplas… Para entender melhor recomendo por em pratica o que consta no tópico abaixo…

1 curtida