wie zu verhindern virtuelle Funktion in Konstruktor oder Destruktor aufrufen?

StackOverflow https://stackoverflow.com/questions/4495640

  •  12-10-2019
  •  | 
  •  

Frage

Einige C ++ Materialien erwähnen wir nicht eine virtuelle Funktion innerhalb Ctor oder dtor aufrufen können,

(
sorry, ich denke, es zu ändern ist besser zu
Einige C ++ Materialien erwähnen wir lieber nicht eine virtuelle Funktion innerhalb Ctor oder dtor zu nennen,

)

, aber wir können sie versehentlich nennen. Gibt es eine Möglichkeit, das zu verhindern?

Zum Beispiel:

# include < iostream >  
using namespace std;  

class CAT  
{  
public:  
    CAT(){ f();}  
    virtual void f(){cout<<"void CAT:f()"<<std::endl;}  
};  

class SMALLCAT :public CAT  
{  
public:  
    SMALLCAT():CAT()  
    {  
    }  
    void f(){cout<<"void SMALLCAT:f()"<<std::endl;}    
};    

int main()  
{  
    SMALLCAT sc;   

}  

Ausgabe:

void CAT::f()  //not we expected!!!

Danke

Keine korrekte Lösung

Andere Tipps

Sie müssen diese „C ++ Materialien“, um die Mülltonne zu werfen.

Sie sicherlich können rufen virtuelle Funktionen aus dem Konstruktor oder Destruktor. Und sie werden ihre Arbeit tun. Sie müssen lediglich Kenntnis von der Sprachspezifikation sein, dass eindeutig fest, dass virtueller Versandmechanismus gemäß arbeitet mit dem Strom dynamischen Typ des Objekts, nicht mit seinem letzten bestimmt dynamischem Typ . Diese Typen sind nicht das gleiche für ein Objekt im Bau / Zerstörung, die oft Neulinge verwirrt, wenn sie virtuelle Funktionen von Konstrukteuren / Destruktoren aufzurufen versuchen. Dennoch ist virtuelle Funktionen aus und Destruktor aufrufen nützliche Funktion der Sprache, so lange wie Sie wissen, was sie tun und wie sie in solchen Fällen arbeiten. Warum würden Sie wollen „verhindern“ oder?

Es ist wie wenn man sagt, dass Divisionsoperator gefährlich ist, da man etwas durch Null teilen kann, und zu fragen, wie man „verhindern“ seine Verwendung im Programm.

Sie können eine virtuelle Funktion in einem Destruktoraufrufs. Nur in bestimmten Fällen wird es nicht funktionieren, und kann Ihr Programm zum Absturz bringen. Die Art und Weise zu verhindern, dass sie rufen nicht, sie zu nennen. Es gibt nichts schicker ich kenne, außer vielleicht einige statische Analyse-Tools auf den Code zu suchen und Sie über mögliche Probleme wie diese warnen.

Sie können sicherlich eine virtuelle Funktion in einem Ctor / dtor nennen. Das Problem ist, dass Ihr VTable in jedem Konstruktor (und destructor) eingerichtet, so dass Ihr virtueller Funktionsaufruf die Implementierung der Klasse nennen, die derzeit aufgebaut wird. Wenn das, was Sie wollen, kühlen. Aber dann kann man auch sparen Sie sich die V-Tabelle Lookup und machen einen scoped Funktionsaufruf.

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