2010-12-14 6 views
4

Ist es legal? Wenn ja, halten Sie es für eine gute Kodierungspraxis?Verwenden von Basisklassenmethoden zum Initialisieren von abgeleiteten Klassenmembern

mag ich so etwas wie dies tun (nicht-essentielle Details werden nicht angezeigt):

class ItemStorage { 
    int size() const; 
}; 

class SpecialStorage : public ItemStorage { 
public: 
    SpecialStorage (...) : ItemStorage(...), items(ItemStorage::size()) {...} 
private: 
    int items; 
}; 

ich mir ziemlich sicher bin, dass es in Ordnung ist, wenn die Methode Größe nicht virtuell ist. Was ist, wenn es virtuell ist und die abgeleitete Klasse es nicht überschreibt?

Antwort

5

Die allgemeine Regel lautet, dass Sie während der Initialisierung nicht auf nicht initialisierte Teile des Objekts zugreifen dürfen. Da ItemStorage bereits initialisiert wird, wenn Elemente initialisiert werden, ist die Aufrufgröße in der Tat in Ordnung.

Auch wenn die Größe virtuell war und selbst wenn sie überschrieben wurde, wäre sie immer noch in Ordnung: Sie würde nur die Basisversion aufrufen (d. H. Virtuelle Methoden binden nur an die Ebene, die gerade erstellt wird).

+0

+1: Ich habe nicht bemerkt, dass der Konstruktor von ItemStorage zuerst aufgerufen wird. – Puppy

+0

WOW. SCHNELL! Danke vielmals. – watson1180

+0

Es würde die Basisversion nur aufrufen, weil sie explizit angegeben ist. Andernfalls ist das Objekt im Aufbau SpecialStorage, und in diesem Fall ist der Aufruf möglicherweise nicht sicher (er basiert auf noch nicht initialisierten Mitgliedern). – UncleBens

Verwandte Themen