Chamando uma função substituída de uma classe base?
-
28-09-2019 - |
Pergunta
Minha pergunta provavelmente será melhor explicada por um exemplo.
Por exemplo, eu tenho 2 classes: uma classe base e uma classe derivada:
class baseClass
{
public:
baseClass()
{
foo();
}
virtual bool foo() { printf("baseClass"); return false;}
};
class derivedClass : public baseClass
{
public:
bool foo()
{
printf("derivedClass");
return true;
}
};
Quando eu crio uma instância de derivedClass
, o construtor em baseClass
será chamado e foo()
será chamado de seu construtor. O problema é que o construtor do Baseclass está chamando de foo()
e não o substituto foo()
que a classe derivada foi substituída. Existe alguma maneira de fazer com que a base de base chamada de função substituída, não é a própria definição da função?
Solução
Você não deve chamar um método virtual de um construtor porque o objeto ainda não foi totalmente construído. Essencialmente, a classe derivada ainda não existe, portanto, seus métodos não podem ser chamados.
Outras dicas
Na maioria das línguas, esse comportamento é proibido ou indefinido, por boas razões.
Considere o seguinte: o construtor da classe base é executado antes do construtor da subclasse; portanto, qualquer Vars definido pela subclasso será não inicializado. Tem certeza de que deseja chamar o método subclassificado nessas circunstâncias?
A alternativa mais simples é definir um método Initialize () na sua superclasse e lembre -se de chamar Initialize () do seu construtor de subclasse.