Frage

Ich lese aus E -Book -Vorlagen vollständiger Leitfaden und Frage, die ich stelle, könnte für dich dumm sein, aber ..

Es gibt einen Abschnitt darin 9.4.2 Abhängige Basisklassen was ich nicht verstehen kann.

Hier ist der Teiltext daraus: http://tinypaste.com/633f0

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

Ich brauche Hilfe bei der Visualisierung der Zeile (oder der Problemdomäne) im obigen Text. "Mit dieser Lösung muss darauf geachtet werden, dass die Qualifikation den virtuellen Aufrufmechanismus und die Bedeutung der Programmänderungen hemmt, wenn der unqualifizierte nicht quondabhängige Name verwendet wird, um einen virtuellen Funktionsaufruf zu erhalten. Trotzdem gibt es Situationen, in denen die erste Variation nicht verwendet werden kann und diese Alternative angemessen ist. "

Ich verstehe, dass der uneingeschränkte, nicht abhängigen Namen usw., aber das Mischen mit virtueller Funktionsanrufe, was mir entlässt.

War es hilfreich?

Lösung

Wenn der qualifizierte Name (Basisfeld) eine virtuelle Funktion ist, hemmt die Qualifikation den virtuellen Aufruf. Es ist sehr ähnlich, als hätten Sie:

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
}

Andere Tipps

Verwenden eines qualifizierten Identifizierers class-name::function() hemmt die virtuelle Ness von function, Sie sollten also verwenden this->function() stattdessen.

Dies funktioniert auch für Datenmitglieder: this->basefield.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top