Classes Abstractas - C++

Exhit

Power Member
Boas,

Eu tenho amanhã um exame e estou confortável com quase toda a matéria, mas só agora me deparei com este código, que me está a dar a volta à cabeça e não percebo porque funciona de uma maneira, mas não de outra. Queria então tirar uma dúvida.

Código:
class X {
public:
virtual void f()=0;
virtual void g()=0;
};

class Y: public X {
void f();
};

class Z: public Y {
void g();
};

X a; //ERRO (percebi)
Y b; //ERRO (percebi)
Z c; //ok (porquê?)

Percebo que dê erro ao criar os objectos "X a" e "Y b", mas não percebo porque no "Z c" não dá erro.

É porque não existe derivação direta para a classe X Abstracta (sendo a única expecificamente abstracta)? Tipo Y é subclasse de X, erro. Mas como Z é subclasse de Y, já não?

Obrigado desde já.
 
Última edição:
Não podes criar uma instância da classe X porque esta tem os métodos "f" e "g" virtuais. Como tem pelo menos um método virtual, é uma classe abstracta.

Não podes criar uma instância da classe Y porque esta, embora defina um corpo para o método "g", mantém o método "f" como virtual. Como tem pelo menos um método virtual, é também ela uma classe abstracta.

A classe Z define um corpo para o método "g" e, como deriva da Y, define também implicitamente um corpo para o método "f". Assim, como não tem nenhum método virtual, pode ser instanciada como qualquer outra classe não abstracta.
 
Obrigado pela resposta.

Para então perceber totalmente, Z não herda f de X, correto? Só herda de Y.
 
Última edição:
Não, Z herda f de X também, mas herda também de Y. Como Y é uma classe mais concreta (menos abstracta) é a implementação de Y que vigora. No entanto Z é tão subclasse de X como Y é.
 
Back
Topo