2016-04-06 15 views
0

Lassen Sie uns sagen, dass wir Codes wie folgen:Anruf overrided Methoden der Nachkommen von virtuellen Destruktor der Basisklasse

class Base{ 
public: 
    virtual ~Base(){PutStat();}; 
    virtual void PutStat(){/* maybe do nothing */}; 
}; 

class Desend : public Base{ 
public: 
    void PutStat() override{/* do something */}; 
}; 

Methode PutStat eine Statistik gedruckt werden. Ich hoffe, dass jede Instanz von Descendants, die von Base geerbt wurde, beim Zerstören automatisch eine Statistiknachricht drucken konnte.

Es scheint eine allgemeine Eigenschaft hier zu sein, stat-message auszugeben, daher ist es vernünftiger, PutStat nur einmal in Base aufzurufen, als PutStat in jedem einzelnen Nachkommen aufzurufen.

Leider ist als Destruktor in Base virtual, also nicht übergelaufen PutSat aufgerufen werden.

So, wie die überarbeitete Version von PutStat in Base-Destruktor aufgerufen wird.

+2

Sie können nicht. Der Destruktor für die abgeleitete Klasse wurde bereits ausgeführt, daher gibt es nichts Sinnvolles, das eine Memberfunktion der abgeleiteten Klasse tun kann. –

+0

Sie können nicht. An dem Punkt, an dem der Basisklassen-Destruktor aufgerufen wird, existiert das abgeleitete Objekt nicht mehr und Sie rufen die Basisklassenversion von PutStat auf. – MikeMB

+0

Und Ihr Destruktor ist nicht virtuell. – MikeMB

Antwort

1

Leider, als Destruktor in Base ist virtuell, damit nicht übergelaufen PutSat aufgerufen werden.

Richtig, aber nicht aus diesem Grund. Der Destruktor, der virtuell ist, hat damit nichts zu tun. Die Methoden der Basisklasse werden aufgerufen, da das Objekt teilweise zurück in die Basisklasse zerstört wurde, was dazu führt, dass seine VFT die einer Basisklasseninstanz ist.

Wie der überschriebenen Version

Sie können nicht nennen. Es ist weg. Das Objekt ist weg. Es würde keinen Sinn ergeben, also erlaubt es C++ nicht.

Verwandte Themen