Herança múltipla em c ++

Se uma classe C ++ pode herdar de outro, então surge imediatamente a pergunta: “Pode uma classe herdar de duas (ou mais) aulas?” A resposta está um incondicional “sim”.

Video: C++ - Aula 48 - POO - Classes - Parte 5

Pode ser útil para ver um exemplo do mundo real de herança múltipla entender por que isso é uma capacidade vale a pena ter. A maioria das universidades oferecem empregos para estudantes de graduação como assistentes de ensino. Estes indivíduos ainda são estudantes e têm todas as propriedades de um estudante -, mas, além disso, eles também são oferecidas as características de um instrutor. Assim, logicamente, sua árvore de herança parece com isso:

A & lt; = span classTeachingAssistant herda de ambos Aluna “/>

UMA Professor assistente herda de ambos Aluna e Instrutor.

Expressa em C ++, isso iria aparecer da seguinte forma:

Video: Programação Orientada a Objetos (Parte 7): herança múltipla, o conceito de interface

classe Student {public: GPA double () - bool inscrever (Curso) pay -bool (dólares duplas) -} - classe instrutor {public: grau duplo (Artefato) -bool ensinar (claro) -bool GetPaid (dólares duplos) -} TeachingAssistant de classe: Estudante pública, Instrutor pública {public: conselheiro Instructor (Instrutor) -Instructor conselheiro () -} -

A única diferença entre este exemplo e exemplos de herança simples é o aparecimento de dois nomes de classe depois da declaração de Professor assistente.

Dadas as definições de classe apenas mostrados, todos os seguintes podem ser ditas:

TeachingAssistant ta - // obter um grau como um d studentdouble = ta.gpa () - // grau um papel como um instructorta.grade (documento) - // posso passar uma ta para uma função que espera uma festa Studentvoid (Student ) -party (ta) - // ou uma função que espera um sarau Instructorvoid (instrutor) -soiree (ta) -

Por enquanto, tudo bem. O que há para não gostar sobre a herança múltipla?

Video: Tutorial - 6.1 Herança Múltipla

múltiplas ambiguidades

Revendo Aluna e Instrutor aulas, essas duas classes de acções de uma propriedade: um número de identificação atribuído pelo universidade. Mas se você tentar adicionar esta propriedade da seguinte forma, você não ganha nada, mas as queixas de C ++:

classe Student {public: IntID () - double GPA () - bool inscrever (Curso) pay -bool (dólares duplas) -} - classe instrutor {public: int id () - duplo grau (Artefato) -bool ensinar (Curso) -bool GetPaid (dólares duplas) -} - classe TeachingAssistant: Estudante pública, Instrutor pública {public: conselheiro Instructor (Instrutor) -Instructor conselheiro () -

};



Este problema é mostrado graficamente, aqui:

Adicionando o <span class =id () propriedade para ambos Aluna e

id () Propriedade é herdada de uma classe base comum a ambos
o
identidade() propriedade é herdada de uma classe base comum a ambos Aluna e Instrutor.

Para tentar expressar esse estado de coisas em C ++, suponha que o seguinte está escrito:

classe Academic {public: int id () -} - classe Student: Academic pública {public: GPA double () - bool inscrever (Curso) pay -bool (dólares duplas) -} - Instrutor classe: Academic pública {public: grau duplo (Artefato) -bool ensinar (Curso) -bool GetPaid (dólares duplas) -} - classe TeachingAssistant: Estudante pública, Instrutor pública {public: Instrutor conselheiro (Instrutor) -Instructor conselheiro () -} -

Infelizmente (e surpreendentemente), esta abordagem não resolve o problema. Uma referência a ta.id () ainda é ambígua. Acontece que este código não cria a imagem-anterior em vez disso, ele cria a situação mostrada aqui:

A classe base única pode ser herdada na subclasse várias vezes.

A classe base única pode ser herdada na subclasse várias vezes.

Parece que Professor assistente agora herda acadêmico duas vezes - uma por meio de sua Aluna-ness, e novamente através de sua Instrutor-ness. Ela agora tem um Estudante :: Academic id :: () e um Instrutor :: Academic id :: ().

Resolver a ambigüidade

A fim de alcançar o que aparece na terceira figura deste artigo em C ++, você deve voltar a cair chamadas algo C ++ herança virtual. Esta característica aparece em ação como segue:

classe TeachingAssistant: Estudante pública virtual, instrutor público virtual {public: conselheiro Instructor (Instrutor) -Instructor conselheiro () -} -

O uso do virtual palavra-chave diz C ++ para combinar quaisquer classes de base comuns que Aluna e Instrutor pode compartilhar. O seguinte não gera um erro do compilador:

cout << "TA"s student id is " << ta.id()- // no error now

Com a herança virtual, Professor assistente herda uma e apenas uma cópia do acadêmico e a referência a ta.id () não é mais ambíguo.

Video: Curso C# - Aula 9 - Trabalhando com Herança, Classes abstratas, e Interfaces


Publicações relacionadas