Problema de diamante C ++

Problema de diamante C ++
Um problema de diamante é um problema que ocorre nas linguagens de programação, especialmente em C ++, quando você está usando várias herança. Múltiplas heranças em C ++ são comumente usadas como uma ferramenta quando o código é muito longo. Então, para lidar com o código -fonte, usamos classes para gerenciar o programa. No entanto, as múltiplas heranças causam um problema se não for usado corretamente. Esses problemas contêm principalmente o problema de diamante. Este tutorial tem como objetivo destacar os principais fatores do problema de diamante, como ocorre a partir das múltiplas heranças e todas as soluções necessárias para resolvê -lo.

Para executar os programas sobre "herança de diamante C ++" no sistema operacional Linux, você precisa ter um sistema Ubuntu instalado e executando na máquina virtual. Duas ferramentas são usadas. Um é qualquer ferramenta de edição e, como tal, usaremos o "editor de texto" padrão do Linux. Você pode usar outras ferramentas de edição preferidas. O segundo é o terminal do Ubuntu. Em que você executará o programa e poderá ver a saída exibida.

Primeiro, discutiremos várias heranças no artigo, pois o "problema de diamante" ocorre no caso de ter herança no código -fonte.

Herança múltipla em C++

Quando falamos sobre o uso de classes hierarquicamente no programa, sempre conhecemos OOP (programação orientada a objetos). Porque essa herança é uma característica importante da orientação de objetos, onde uma subclasse é capaz de herdar de uma ou mais superclasses. Dessa forma, uma aula infantil tem dois ou mais pais.

Por exemplo, se uma mãe e pai tiverem um filho em um cenário da vida real, a criança herdará tudo dos pais. Portanto, essa criança é conhecida por ser uma classe derivada com mãe e pai como pais. Vamos voltar para as múltiplas heranças. Usaremos "construtores" como parte de nossa discussão atual. Os construtores de uma classe herdada (classe infantil) em várias heranças executadas seguindo sua ordem herdada. Considerando que para os destruidores, a ordem é o inverso da herança. Agora, citaremos um exemplo simples para demonstrar a funcionalidade da herança em c++.

Exemplo de múltiplas heranças

Considere um exemplo em que existem duas classes, Classe A e Classe B, como classe pai, e essas duas classes têm uma classe infantil chamada Classe C. Esta aula é uma classe derivada de ambos os seus pais. Usaremos um construtor na parte pública de cada classe.

A primeira etapa do código é usar uma biblioteca para permitir o streaming de entrada e saída:

Então temos que declarar classe A, tendo os construtores com o nome da classe. Como você sabe que os construtores são declarados com o nome dessa classe, e estes são chamados sempre que o objeto é criado. No construtor, foi exibida uma mensagem simples que mostra qual construtor de classe é executado. Agora, definimos a classe B com a mesma abordagem. Após as duas aulas dos pais, a classe infantil é mencionada.

Uma coisa que deve ser observada aqui é a ordem das classes dos pais que a criança herda, porque essa ordem será importante no momento da execução do construtor e uma mensagem exibindo.

Agora, na classe principal, criaremos um objeto da classe infantil. Como possui várias heranças, não há necessidade de criar o objeto para a classe pai. Eles são executados automaticamente por causa do objeto de classe infantil:

Int main ()
C c;
Retornar 0;

Depois de escrever o código anterior no editor de texto, salve este arquivo com a extensão de '.C '. Vamos executar o arquivo no terminal Ubuntu. Para o objetivo de execução, é necessário um compilador. Em C ++, usamos um compilador G ++. Caso contrário, você precisa primeiro instalá -lo:

$ G ++ -O M1 M1.c
$ ./m1

Use G ++ com o nome do arquivo com o código -fonte e aquele em que você deseja mostrar a saída. Nota, -o é usado para salvar a saída. Como a classe B é herdada acima da classe A, então seu construtor é executado primeiro, você pode ver a saída da imagem anterior.

Como o conceito de herança está claro agora, discutiremos o "problema de diamante" aqui.

Problema de diamante

Um problema de diamante é um caso apenas em múltiplas heranças que ocorre quando uma classe infantil tem os valores herdados dos dois pais. Em que essas aulas de pais são herdadas de uma classe comum de avós.

Por exemplo, considere um exemplo em que temos uma classe infantil herdada das classes da mãe e do pai. Essas classes herdam uma terceira classe chamada "Pessoa":

Criança> Mãe> Pessoa
> Pai> pessoa

Então, de acordo com o cenário fornecido, a classe infantil herda a classe "pessoa" duas vezes no programa. Certa vez, é da mãe e, novamente, a segunda vez é do pai. Isso cria confusão para o compilador executar qual construtor primeiro. Esta situação causa um gráfico de herança em forma de diamante. Portanto, é conhecido como "o problema do diamante".

A abordagem de código é quase a mesma. Declare a classe base e depois duas aulas de criança herdada (mãe, pai) da classe base. Cada classe é seguida pelo construtor com uma variável para armazenar um valor nela:

Agora, apresentando a classe infantil:

# Criança Criança: Pai Público, Mãe Pública

A classe infantil herdará as duas classes dos pais. A função principal usará o objeto da criança e um valor no parâmetro da chamada do construtor:

Depois de salvar o código, é hora de usar o compilador para a execução e ver o resultado:

Agora, você pode observar que a classe base é chamada duas vezes. Este é um problema de diamante. Depois de descrever o problema, agora encontraremos uma solução possível.

Solução de problema de diamante

A solução depende do uso da palavra -chave "virtual". Classes de dois pais com uma classe base comum agora herdarão a classe base virtualmente para minimizar a ocorrência de cópias da classe base na classe infantil. Agora, modificaremos o código usando essa palavra -chave:

Sempre que a classe dos pais herda da aula dos avós, "virtual" é usado, mas apenas com os pais, não no caso de uma criança. Esta é "a herança virtual". Limita a passagem de mais de uma única instância da classe base a ser passada.

# Pai da aula: Pessoa Pública Virtual

Agora, vamos executar o código. Os valores resultantes mostram que a ambiguidade é removida usando este conceito:

Para evitar a repetição do construtor base a ser chamado, o construtor de uma classe base virtual não é alcançado através da classe que a herdou. No entanto, este construtor é chamado do construtor de classe de concreto. No exemplo atual, a classe infantil chama o construtor de classe "pessoa" diretamente.

Conclusão

"C ++ Diamond Problem" é um artigo escrito para remover a ambiguidade da repetição da classe base em várias heranças. O conceito de herança é explicado brevemente com exemplos. Da mesma forma, a causa e a solução para o problema do diamante também são elaboradas em detalhes. Esperamos que este tutorial possa fornecer orientação no campo dos programas C ++.