a capacidade de uma classe para derivar propriedades e características de outra classe é chamada herança. A herança é uma das características mais importantes da Programação Orientada a objetos.subclasse: a classe que herda propriedades de outra classe é chamada subclasse ou classe derivada.
Super Classe: A classe cujas propriedades são herdadas pela sub classe é chamada classe Base ou super classe.
O artigo é dividido em seguintes subtópicos:
- Por que e quando usar herança?,por que e quando usar herança?considere um grupo de veículos. Você precisa criar aulas para ônibus, carro e caminhão. Os métodos fuelAmount (), capacity (), applyBrakes () serão os mesmos para todas as três classes., Se nós criar essas classes, evitando a herança, em seguida, podemos escrever todas estas funções em cada uma das três classes, como mostrado na figura abaixo:
Você pode ver claramente que o processo acima resulta na duplicação do mesmo código 3 vezes. Isso aumenta as chances de erro e redundância de dados. Para evitar este tipo de situação, a herança é usada., Se criarmos um veículo de classe e escrevermos estas três funções nele e herdarmos o resto das classes da classe de veículo, então podemos simplesmente evitar a duplicação de dados e aumentar a reutilização. Olhar para o diagrama abaixo, em que as três classes que são herdadas da classe de veículo:
Usando herança, podemos escrever as funções apenas uma vez, em vez de três vezes herdamos resto das três classes da classe base(Veículo).,
Implementing inheritance in C++: For creating a sub-class which is inherited from the base class we have to follow the below syntax.
Sintaxe:class subclass_name : access_mode base_class_name{ //body of subclass};
Aqui, subclass_name é o nome da sub-classe, access_mode é o modo no qual você deseja herdar esta sub-classe, por exemplo: público, privado, etc. e base_class_name é o nome da classe base da qual você deseja herdar a sub-classe.nota: uma classe derivada não herda o acesso a membros de dados privados., No entanto, ela herda um objeto pai completo, que contém todos os membros privados que essa classe declara.
Resultado:
Child id is 7Parent id is 91
No programa acima a ‘Criança’ classe é publicamente herdadas do ‘Pai’ da classe para que o público os membros de dados da classe ‘Pai’ também será herdada pela classe “Criança”.modo público: se derivarmos uma subclasse de uma classe de base pública., Em seguida, o membro público da classe base tornar-se-á público na classe derivada e os membros protegidos da classe base tornar-se-ão protegidos na classe derivada.Modo Protegido: se derivarmos uma sub-classe de uma classe de base protegida. Em seguida, tanto os membros públicos e protegidos da classe base tornar-se-ão protegidos na classe derivada.modo privado: se derivarmos uma subclasse de uma classe de base privada. Em seguida, tanto os membros públicos e protegidos da classe base tornar-se-ão privados na classe derivada.,
Nota : Os membros privados da classe base não podem ser acessados diretamente na classe derivada, enquanto os membros protected podem ser acessados diretamente. Por exemplo, as Classes B, C E D contêm todas as variáveis x, y E z em baixo exemplo. É apenas uma questão de acesso.,
A tabela abaixo resume as três modos e mostra o especificador de acesso dos membros da classe base na classe sub quando obtidos no public, protected e private modos:
Tipos de Herança em C++
Um caso especial de híbridos de herança : herança de vários caminhos:
Uma classe derivada com duas classes base e essas duas classes base tem uma classe base comum é chamado de herança de vários caminhos. Uma ambigüidade pode arrise neste tipo de herança.,
Considere o programa a seguir:
Resultado:
A from ClassB : 10A from ClassC : 100B : 20C : 30D : 40
No exemplo acima, ambos os ClassB & ClassC herdar ClassA, ambos têm de cópia única de ClassA. No entanto ClassD herdar tanto ClassB & ClassC, portanto ClassD ter duas cópias de ClassA, um de ClassB e outro de ClassC.,
Se precisamos acessar os dados de um membro da ClassA através do objeto de ClassD, devemos especificar o caminho a partir dos quais um será acessado, seja a partir ClassB ou ClassC, bco z compilador não pode diferenciar entre duas cópias de ClassA em ClassD.
existem 2 maneiras de evitar esta ambiguidade:
- Use scope resolution operator
- Use virtual base class
evitar ambiguidade usando scope resolution operator:
Usando scope resolution operator podemos especificar manualmente o caminho a partir do qual data member a será acessado, como mostrado na Declaração 3 e 4, no exemplo acima.,
obj.ClassB::a = 10;
obj.ClassC::a = 100;
Nota : Ainda assim, há duas cópias da ClassA em ClassD.,
Evitar ambigüidade usando a classe base virtual:
Saída:
A : 100B : 20C : 30D : 40
de Acordo com o exemplo acima, ClassD tem apenas uma cópia de ClassA, portanto, instrução 4 irá substituir o valor de a, dado à afirmação 3.este artigo é contribuido pela ágar-Cha dura. Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando contribute.geeksforgeeks.org ou e-mail o seu artigo para [email protected]., Veja seu artigo aparecendo na página principal dos GeeksforGeeks e ajude outros Geeks.
Attention reader! Não pares de aprender agora. Obtenha todos os conceitos importantes da Fundação C++ e STL com a Fundação C++ e os cursos STL a um preço amigável para os estudantes e se torne a indústria pronta.Tags para artigos: