quinta-feira, agosto 17, 2006

Aula 6

continuação direta da aula 5
Uma instância de uma classe com métodos virtuais possui em sua estrutura, além dos atributos declarados na classe, um ponteiro para a TPMV da classe(espaço para esse ponteiro é alocado pelo compilador). Por exemplo,

A* pa=new A(); //construtor padrão

|_&A::TPMV_|<-----------|__|pa
|____a_____|


pa=new B();

|_&B::TPMV_|<----------|__|pa
|___A::a____|
|___B::b____|
|___B::c____|


O acoplamento do método à mensagem pa->f(); em C++ é feito da seguinte forma:
  • O endereço da TPMV do objeto apontado por "pa" é obtido(é o primeiro campo do objeto);
  • O endereço do método a ser acoplado é obtido da TPMV e corresponde à entrada do índice do método virtual f()(neste caso 0(zero));
  • Os argumentos do método e "this" são empilhados e o método é finalmente invocado: (*(pa->TPMV[0]))(pa) //(* (endereço de TPMV[índice de f()]))( this)
O grande benefício da junção posterior é cófigo novo funcionando com código velho eliminando construções do tipo switch case, um método Figura2d::Desenha() ilustra isso
class Figura2D
{
private:
Primitivo2D& Primitivo;
int NDPr;
public:
void AdicionaPrimitivo(Primitivo);
void Desenha() const;
Figura2D();
Primitivo(0);
NDPr(0);
};

void Figura2D::Desenha() const
{
for(Primitivo2D* p=Primitivo; p; p=p->Prox)
p->Desenha();
}

O método irá funcionar para qualquer objeto cuja classe derivada de Primitivo2D() e sobrecarregar o método abstrato Primitivo2d::Desenha(). Estamos falando não apenas das classes Linha2D e Círculo2D, mas de qualquer classe derivada de Primitivo2D.
Obs Um método abstrato em c++ é um método virtual puro. Toda classe que declarar pelo menos um métodos abstrato é uma classe abstrata. Uma classe abstrata não admite instância.( Em java, uma classe pode ser declarada abstrata mesmo se possuir um método abstrato, porém, se uma classe possuir um método abstrato, então também deve ser declarado abstrato)

0 comentários:

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Justin Bieber, Gold Price in India