Domanda

Forse mi sbaglio, ma questo sembra essere una domanda molto semplice. Improvvisamente il mio catena di ereditarietà ha smesso di funzionare. Scrivendo una piccola applicazione di prova di base ha dimostrato che mi era che era sbagliato (quindi non posso dare la colpa al compilatore).

Ho una classe di base, con il comportamento di default in una funzione virtuale. Una classe bambino deriva da quello e modifica il comportamento.

#include <iostream>

class Base
{
public:
    Base() { print(); }
    ~Base() {}

protected:
    virtual void print() { std::cout << "base\n"; }
};

class Child : public Base
{
public:
    Child() {}
    ~Child() {}

protected:
    virtual void print() { std::cout << "child\n"; }
};

int main()
{
    Base b;
    Child c;
}

Questo stampa:

base
base

Quando si crea un'istanza Bambino, perché è la base :: print () chiamato? Ho pensato che, utilizzando la parola chiave virtuale, la funzione può essere sostituito per la classe derivata.

A che punto ho ottenuto me stesso confuso?

È stato utile?

Soluzione

Si sta chiamando un metodo virtuale nel costruttore, che non sta andando a lavorare, come la classe bambino non è ancora completamente inizializzato.

Si veda anche questa domanda StackOverflow .

Altri suggerimenti

Anche se il vostro problema attuale è il metodo di chiamata virtuale da un costruttore che altri hanno detto, ho notato che non hai fatto i distruttori virtuale. Questo è normalmente una brutta cosa. Nel tuo caso, i distruttori sono PON e non ci sono utenti che sono oggetti con distruttori, ... ma se il codice cambia, allora è facile per le cose cattive che accada.

questo link per una spiegazione dettagliata (per non chiamare le funzioni virtuali da ctor / dtor).

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