Domanda

La mia domanda sarà probabilmente essere meglio spiegato con un esempio.

Per esempio, ho 2 classi: una classe base e una classe derivata:

class baseClass
{
public:
    baseClass()
    {
        foo();
    }
    virtual bool foo() { printf("baseClass"); return false;}

};

class derivedClass : public baseClass
{
public:
    bool foo()
    {
        printf("derivedClass");
        return true;
    }

};

Quando creo un'istanza derivedClass, il costruttore in baseClass sarà chiamato, e foo() sarà chiamato da esso del costruttore. Il problema è, costruttore delle BaseClass' sta chiamando il proprio foo() e non il foo() override che la classe derivata ha ignorato. Esiste un modo per rendere i BaseClass chiamano la funzione override, non è proprio la definizione della funzione?

È stato utile?

Soluzione

Non si dovrebbe chiamare un metodo virtuale da un costruttore perché l'oggetto non è stato ancora completamente costruito. In sostanza, la classe derivata non esiste ancora, per cui i suoi metodi non possono essere chiamati.

Altri suggerimenti

Nella maggior parte delle lingue, questo comportamento è vietato o undefined, con buona ragione.

Considerate questo: il costruttore della classe base viene eseguito prima il costruttore della sottoclasse, in modo che qualsiasi vars definito dalla sublass verrà inizializzata. Sei sicuro che si desidera chiamare il metodo sottoclasse in queste circostanze?

L'alternativa più semplice è quello di definire un metodo initialize () nella superclasse, quindi basta ricordarsi di chiamare Initialize () dal costruttore della sottoclasse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top