2016-06-27 14 views
-1

Angenommen, ich habe ein Array von Basisklassenzeigern. Kann ich einen abgeleiteten Klassenobjektzeiger (abgeleitet von dieser Basisklasse) in diesem Array speichern? und kann ich das anders herum machen?Können abgeleitete Objektzeiger in einem Array von Basisklassenzeigern gespeichert werden?

+0

Warum machen Sie es nicht zu einer praktischen Frage, indem Sie Code bereitstellen? – user463035818

+0

Weil es eine theoretische Frage von einer College-Prüfung ist und kein Code zur Verfügung gestellt wurde. – Akra

+1

Ja, Sie können ein 'Derived *' in einem 'std :: vector ' speichern, aber nicht umgekehrt. – ArchbishopOfBanterbury

Antwort

4

Kann ich einen abgeleiteten Klassenobjektzeiger (abgeleitet von dieser Basisklasse) in diesem Array speichern?

Ja.

und kann ich es anders herum tun?

Nr

Angenommen, Sie haben:

struct Base 
{ 
}; 

struct Derived1 : Base 
{ 
}; 

struct Derived2 : Base 
{ 
}; 

std::vector<Derived1*> ptrs; 
Base* bPtr = new Derived2; 
ptrs.push_back(bPtr);  // Not allowed. 
          // If it were, imagine the problems. 
          // You have a Derived2* in the guise of a Derived1* 
+0

Will I in der Lage sein, dies auch dann zu tun, wenn die abgeleitete Klasse zusätzliche öffentliche Funktionen hat? – Akra

+1

Sie können. Sie können jedoch nicht über die Basisklassenzeiger auf die abgeleiteten Klassenmitglieder zugreifen. Um auf die abgeleiteten Klassenmitglieder zuzugreifen, müssen Sie den Zeiger zuerst auf den abgeleiteten Klassenzeiger zurückwerfen. –

3

Sie in der Tat ein Derived* in einer Reihe von Base* (oder einer anderen Datenstruktur von Base Zeigern für diese Angelegenheit) speichern können.

Aber das Gegenteil ist nicht wahr, da es die Liskov Substitution Principle verletzt.

Verwandte Themen