Domanda

Sto leggendo da modelli di ebook Guida completa e domanda che farò potrebbe essere stupido per te ma ..

C'è una sezione in questo 9.4.2 Classi di base dipendenti che non riesco a capire.

Ecco il testo parziale da esso: http://tinypaste.com/633f0

// Variation 2: 
template<typename T> 
class DD2 : public Base<T> { 
  public: 
    void f() { Base<T>::basefield = 0; } 
}; 

Ho bisogno di aiuto per visualizzare la riga (o il dominio problematico) nel testo sopra "È necessario prestare attenzione con questa soluzione, perché se il nome non dipendente non qualificato viene utilizzato per formare una chiamata di funzione virtuale, la qualifica inibisce il meccanismo di chiamata virtuale e il significato del programma cambia. Tuttavia, ci sono situazioni in cui la prima variazione non può essere utilizzata e questa alternativa è appropriata "

Capisco il nome non dipendente non qualificato ecc. Ma mescolarli con la chiamata di funzione virtuale è ciò che mi sfuggirà.

È stato utile?

Soluzione

Se il nome qualificato (Basefield) è una funzione virtuale, la qualifica inibisce la chiamata virtuale. È molto lo stesso di se avessi:

struct Base {
  virtual void vCall() { }
};

struct Derived : public Base {
  virtual void vCall() { }
};

int main() {
  Derived d;
  Base* inst = &d;
  inst->Base::vCall(); // By qualifying we won't get virtual dispatch;
                       // this calls Base::vCall directly
}

Altri suggerimenti

Usando un identificatore qualificato class-name::function() inibisce la virtuale di function, quindi dovresti usare this->function() invece.

Questo funziona anche per i membri dei dati: this->basefield.

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