Exame - 14 de Setembro de 1999
1. Considere o seguinte programa:
| #include <iostream.h> class original { public: original() { cout << "Constructor original.\n"; } virtual ~original() { cout << "Destructor original.\n"; } virtual void escreve() { cout << "Escreve original.\n"; } }; main() { original *p1 = new original; original *p2 = new derivada; derivada *p3 = new derivada; p1->escreve(); p2->escreve(); p3->escreve(); delete p1; delete p2; } |
class derivada : public original { public: derivada() { cout << "Constructor derivada.\n"; } virtual ~derivada () { cout << "Destructor derivada.\n"; } virtual void escreve() { cout << "Escreve derivada.\n"; } }; |
a) Indique todas as mensagens e por ordem, que o programa emite ao ser executado.
Constructor original. Constructor original. Constructor derivada. Constructor original. Constructor derivada. Escreve original. Escreve derivada. Escreve derivada. Destructor original. Destructor derivada.
b) Quais as alterações às mensagens anteriores se a função void escreve() deixasse de ser virtual.
Constructor original. Constructor original. Constructor derivada. Constructor original. Constructor derivada. Escreve original. Escreve original. <<-- Única alteração Escreve derivada. Destructor original. Destructor derivada.
2. Deseja-se representar formas geométricas bidimensionais. Estas formas são caracterizadas fundamentalmente por nº de vértices (int), padrão de preenchimento (string de tamanho variável) e cor (int).
a) Declare uma classe (CTeste) que modelize os objectos descritos, referindo os membros de dados, constructor cópia e destructor.
class CTeste
{
public:
int vertices;
char* padrao;
int cor;
CTeste(const CTeste& t)
{
vertices = t.vertices;
padrao = (char*) new char[strlen(t.padrao)];
strcpy(padrao, t.padrao);
cor = t.cor;
}
~CTeste()
{
delete [] padrao;
}
};
b) Implemente o operador ==(const CTeste&), que devolva 1 (verdadeiro) se os elementos forem equivalentes ou 0 (falso) se diferentes. Dois objectos CTeste são equivalentes se o nº de vértices, padrão e cor de cada um dos objectos forem iguais.
int CTeste::operator==(const CTeste& t)
{
if (vertices == t.vertices && cor == t.cor
&& strcmp(padrao, t.padrao) == 0 )
return 1;
else
return 0;
}
c) Altere a declaração da classe, considerando que cada um dos vértices da figura é especificado pelo par (x, y) formando uma cadeia que varia de tamanho em função do nº de vértices. Pode supor a exitência da estrutura PONTO definida como:
struct PONTO { int x; int y; };
class CTeste
{
public:
int vertices;
char* padrao;
int cor;
PONTO *pontos;
// continua ...
};
d) Implemente o constructor cópia, considerando as alterações referidas na alínea anterior.
CTeste(const CTeste& t)
{
vertices = t.vertices;
padrao = (char*) new char[strlen(t.padrao)];
strcpy(padrao, t.padrao);
cor = t.cor;
pontos = (PONTO*) new PONTO[vertices];
for(int i=0;i<vertices;i++)
{
pontos[i].x = t.pontos[i].x;
pontos[i].y = t.pontos[i].y;
}
};
Última actualização: 20-12-1999