Diferença entre herança e polimorfismo
Contente
A herança permite, a reutilização do código e o polimorfismo é a ocorrência de uma função com forma diferente. A diferença básica entre herança e polimorfismo é que a herança permite que o código já existente seja reutilizado novamente em um programa, e o polimorfismo fornece um mecanismo para decidir dinamicamente qual a forma de uma função a ser invocada.
- Gráfico de comparação
- Definição
- Principais diferenças
- Conclusão
Gráfico de comparação
Base para Comparação | Herança | Polimorfismo |
---|---|---|
Basic | A herança está criando uma nova classe usando as propriedades da classe já existente. | O polimorfismo é basicamente uma interface comum para múltiplas formas. |
Implementação | A herança é basicamente implementada em classes. | O polimorfismo é basicamente implementado em função / métodos. |
Usar | Apoiar o conceito de reutilização no OOP e reduzir o comprimento do código. | Permite que o objeto decida qual forma da função será chamada quando, no tempo de compilação (sobrecarga), bem como no tempo de execução (substituição). |
Formulários | A herança pode ser uma herança única, herança múltipla, herança multinível, herança hierárquica e herança híbrida. | O polimorfismo pode ser um polimorfismo em tempo de compilação (sobrecarga) ou polimorfismo em tempo de execução (substituição). |
Exemplo | A tabela de classe pode herdar o recurso dos móveis de classe, pois uma mesa é um móvel. | A classe study_table também pode ter a função set_color () e uma classe Dining_table também pode ter a função set_color (), portanto, qual a forma da função set_color () a ser chamada pode ser decidida em ambos, tempo de compilação e tempo de execução. |
Definição de herança:
A herança é um dos recursos cruciais do OOP, que apóia fortemente a "reutilização". A reutilização pode ser descrita como a criação de uma nova classe, reutilizando as propriedades da classe existente. Na herança, há uma classe base, que é herdada pela classe derivada. Quando uma classe herda qualquer outra classe, os membros da classe base se tornam os membros de uma classe derivada.
A forma geral de herdar uma classe é a seguinte:
classe nome-classe-derivado: especificador de acesso nome-classe-base {// corpo da classe};
Aqui, o especificador de acesso fornece o modo de acesso (privado, público, protegido) aos membros da classe base à classe derivada. Se nenhum especificador de acesso estiver presente, por padrão, ele será considerado "particular". No C ++, se a classe derivada for "struct", o especificador de acesso será "public" por padrão.
Em C ++, a herança pode ser alcançada em cinco formas. Eles podem ser classificados como: -
- Herança única (apenas uma super classe)
- Herança Múltipla (várias superclasses)
- Herança Hierárquica (uma super classe, muitas subclasses)
- Herança Múltipla (derivada de uma classe derivada)
Em Java, a classe herda a outra classe usando a palavra-chave “extends”. Em Java, a classe base é referida como uma superclasse e a classe derivada é referida como uma subclasse. Uma subclasse não pode acessar os membros da classe base, que são declarados como "particulares". A forma geral que herda a classe em Java é a seguinte.
classe nome-classe-derivado estende o nome-classe-base {// corpo da classe};
Java não suporta a herança de múltiplas heranças, enquanto suporta hierarquia multinível. Em Java, algumas vezes uma superclasse pode querer ocultar seus detalhes de implementação e torna parte desses dados "privados". Como em Java, uma subclasse não pode acessar os membros privados da superclasse e se uma subclasse deseja acessar ou inicializar esses membros, o Java fornece uma solução. A subclasse pode consultar os membros de sua superclasse imediata usando a palavra-chave "super". Lembre-se, você só pode acessar os membros da superclasse imediata.
O 'super' tem duas formas gerais. O primeiro é que ele chama o construtor da superclasse. A segunda é acessar o membro da superclasse que foi oculto pelo membro da subclasse.
// primeira forma de chamar o construtor. classe supper_class {supper_class (argument_list) {..} // construtor da super classe}; classe sub_class estende supper_class {sub_class (argument_list) {..} // construtor da sub_class super (argument_list); // sub_class chama o construtor da super classe}};
// segundo da super classe supper_class {int i; } classe sub_class estende supper_class {int i; sub_classe (int a, int b) {super.i = a; // i da super classe i = b; // i da subclasse}};
Definição de Polimorfismo
O termo polimorfismo significa simplesmente 'uma função, múltiplas formas'. O polimorfismo é alcançado no tempo de compilação e no tempo de execução. O polimorfismo em tempo de compilação é alcançado através de "sobrecarga", enquanto que o polimorfismo em tempo de execução é alcançado através de "substituição".
O polimorfismo permite que o objeto decida “qual forma da função será chamada quando” em ambos, compilar o tempo e o tempo de execução.
Vamos discutir o primeiro conceito de sobrecarga. Na sobrecarga, definimos uma função na classe mais de uma vez com diferentes tipos de dados e número de parâmetros, enquanto a função a ser sobrecarregada deve ter o mesmo tipo de retorno. Na maioria das vezes, as funções para os sobrecarregados são construtores da classe.
sobrecarga de classe {int a, b; public: int overload (int x) {// primeiro construtor overload () a = x; retornar a; } int overload (int x, int y) {// segundo construtor overload () a = x; b = y; retornar a * b; }}; int main () {sobrecarga O1; Sobrecarga O1 (20); // primeiro construtor overload () chama O1.overload (20,40); // segunda chamada do construtor overload ()}
Agora, vamos discutir a segunda forma de polimorfismo, ou seja, substituir. O conceito de substituição só pode ser implementado para a função das classes que também implementam o conceito de herança. No C ++, a função a ser substituída é precedida pela palavra-chave “virtual” na classe base e redefinida na classe derivada com o mesmo protótipo, exceto a palavra-chave “virtual”.
classe base {public: virtual void funct () {// função virtual da classe base cout << "Esta é uma classe base funct ()"; }}; classe derivada1: base pública {public: void funct () {// função virtual da classe base redefinida na classe derivada1 cout << "Esta é uma classe derivada1 funct ()"; }}; int main () {base * p, b; derivado d1; * p = & b; p-> funct (); // chama a classe base funct (). * p = & d1; retornar 0; }
- A herança está criando uma classe que deriva seu recurso de uma classe já existente. Por outro lado, o polimorfismo é uma interface que pode ser definida de várias formas.
- A herança é implementada nas classes, enquanto o polimorfismo é implementado nos métodos / funções.
- Como a herança permite que uma classe derivada use os elementos e métodos definidos na classe base, a classe derivada não precisa definir esses elementos ou métodos novamente, portanto, podemos dizer que aumenta a reutilização do código e, portanto, reduz o tamanho do código . Por outro lado, o polimorfismo permite que um objeto decida qual a forma do método que ele deseja chamar no tempo de compilação e no tempo de execução.
- A herança pode ser classificada como herança única, herança múltipla, herança multinível, herança hierárquica e herança híbrida. Por outro lado, o polimorfismo é classificado como sobrecarga e substituição.
Conclusão:
Herança e polimorfismo são conceitos inter-relacionados, pois o polimorfismo dinâmico se aplica às classes que também implementam o conceito de herança.