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”.
Conteúdo
- Video: c++ - aula 48 - poo - classes - parte 5
- Video: programação orientada a objetos (parte 7): herança múltipla, o conceito de interface
- Video: tutorial - 6.1 herança múltipla
- Múltiplas ambiguidades
- Resolver a ambigüidade
- Video: curso c# - aula 9 - trabalhando com herança, classes abstratas, e interfaces
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:
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:
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:
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.