Programação orientada a objetos C ++ (3) -polimorfismo

Polimorfismo: múltiplas implementações diferentes da interface são chamadas de polimorfismo.A mesma operação atua em objetos diferentes e pode ter interpretações diferentes e produzir resultados de execução diferentes. Em tempo de execução, o método na classe derivada pode ser chamado por meio do ponteiro para a classe base.


Em C ++, existem os seguintes métodos para obter polimorfismo: funções virtuais, classes abstratas, substituições, modelos (nota: a sobrecarga não tem nada a ver com polimorfismo).

palavra-chave virtual:

Quando o compilador encontra a palavra-chave virtual durante a execução, ele instala automaticamente o mecanismo necessário para vinculação dinâmica. Primeiro, para essas classes que contêm funções virtuais (observe que elas não são instâncias de classes) - mesmo se a classe ancestral contiver funções virtuais e em si Não-criar uma tabela de função virtual VTABLE. Nessas tabelas de funções virtuais, o compilador colocará os endereços de funções virtuais específicas da classe na ordem de declaração da função. Ao mesmo tempo, coloque um ponteiro chamado vpointer, ou vptr para abreviar, em cada classe com funções virtuais, que aponta para a VTABLE dessa classe.
De modo geral, o tamanho de um objeto é o tamanho de todas as variáveis ​​membro, mas quando existem funções virtuais, mesmo que a classe não tenha nenhuma variável membro, o tamanho de seu objeto não é 0, é o tamanho de um virtual ponteiro de função.
Ao definir uma função da classe pai como uma função virtual, sobrecarregue a função na subclasse, use um ponteiro da classe pai para apontar para o objeto da subclasse e chame a função, a função da subclasse é chamada em vez da classe pai. Se a função na classe pai não for uma função virtual, a função da classe pai é chamada


Por favor, dê uma olhada em um exemplo:
// membros virtuais

</pre><pre name="code" class="cpp"><span style="font-size:24px;">#include <iostream.h>
class CPolygon {
protected:
	int width, height;
public:
	void set_values (int a, int b) {
		width=a;
		height=b;
	}
	virtual int area (void) {  return (0); }
};
class CRectangle: public CPolygon {
public:
	int area (void) { 
		return (width * height); 
	}
};

class CTriangle: public CPolygon {
public:
	int area (void) {
		return (width * height /2);
	}
};

int main () {
	CRectangle rect;
	CTriangle trgl;
	CPolygon poly;
	CPolygon * ppoly1 = ▭
	CPolygon * ppoly2 = &trgl;
	CPolygon * ppoly3 = &poly;
	ppoly1->set_values (4,5);
	ppoly2->set_values (4,5);
	ppoly3->set_values (4,5);
	cout << ppoly1->area() << endl;
	cout << ppoly2->area() << endl;
	cout << ppoly3->area() << endl;
	return 0;
}</span>

 
 

resultado:

 20100

Agora, essas três classes (CPolygon, CRectangle e CTriangle) têm todos os mesmos membros: width, height, set_values ​​() e area (). area () é definida como virtual porque foi posteriormente refinada em subclasses. Você pode fazer um experimento. Se você remover esta palavra-chave (virtual) no código e, em seguida, executar este programa, os resultados do cálculo da área dos três polígonos serão todos 0 em vez de 20,10,0. Isso ocorre porque não há palavra-chave virtual, e a execução do programa não chama mais a função area () correspondente (isto é, CRectangle :: area (), CTriangle :: area () e CPolygon :: area ()) de acordo com o uso real do objeto., Em vez disso, o programa irá chamar CPolygon :: area () porque essas chamadas são feitas através de ponteiros do tipo CPolygon. Portanto, a função da palavra-chave virtual é fazer com que os membros da subclasse com o mesmo nome da classe base sejam chamados no momento apropriado ao usar o ponteiro da classe base, conforme mostrado no exemplo anterior.

Função virtual pura virtual () = 0

valor de retorno da função virtual nome da função (lista de parâmetros) = 0;

As funções de interface são deixadas para serem implementadas por subclasses. Como uma classe pode ter funções virtuais puras para que os objetos desta classe não possam ser criados, mas ponteiros para esta classe possam ser criados

</pre><pre name="code" class="cpp">//virtual members
#include <iostream.h>
class CPolygon {
protected:
	int width, height;
public:
	void set_values (int a, int b) {
		width=a;
		height=b;
	}
	virtual int area (void) =0;
};

class CRectangle: public CPolygon {
public:
	int area (void) { return (width * height); }
};

class CTriangle: public CPolygon {
public:
	int area (void) {
		return (width * height /2);
	}
};
int main () {
	CRectangle rect;
	CTriangle trgl;
	CPolygon * ppoly1 = ▭
	CPolygon * ppoly2 = &trgl;
	ppoly1->set_values (4,5);
	ppoly2->set_values (4,5);
	cout << ppoly1->area() << endl;
	cout << ppoly2->area() << endl;
	return 0;
}

 
 


resultado: 

20
10

Use o mesmo tipo de ponteiro (CPolygon *) para apontar para diferentes tipos de objetos

Classe abstrata: classe com função virtual pura

Acho que você gosta

Origin blog.csdn.net/hgz_gs/article/details/51839507
Recomendado
Clasificación