Stilfrage: Instanziierung von polymorphen Objekten
-
Gehen wir aus von einem Kontainer von Polymorphen Objekten, zB
std::list<Base*> container;Sei
class Derived : public Base
eine konkrete abgeleitete Klasse.Im Code wo die Objekte erzeugt werden, schreibt man lieber
Derived* object = new Derived();
oder
Base* object = new Derived();
?wenn man später
container.push_back(object);
oder etwas vergleichbares macht. (zB einen polymorphe Aufruf die nur einen Base* braucht)Natürlich ist beides gleichwertig, deshalb nur ein Stilfrage.
Aber gibt es hierzu Richtlinien?
Stil #2 hat für mich den Vorteil dass es leichter zu analysieren und refactorn wäre, wenn die Zeile hunderte male im Code auftaucht (mit verschiedenen Deriveds).
Stil #1 ist expliziter, und natürlich dann zwingend wenn man noch Derived-spezifischen Code anbringen möchte bevor man das Objekt "abgibt".
-
Logischerweise dürfte der erste Fall hier gar nicht vorkommen. Denn dort weißt du ja schon zur Compilezeit, was für ein Typ das ist und bräuchtest in der Folge weder einen gemeinsamen Container, noch Polymorphie. Ich will natürlich nicht ausschließen, dass genau dies der Fall ist; Polymorphie wird gerne benutzt, wo sie nicht nötig wäre.
-
scrontch schrieb:
Im Code wo die Objekte erzeugt werden, schreibt man lieber
Derived* object = new Derived();
oder
Base* object = new Derived();Weder noch, man benutzt Smart Pointer und dann entweder std::make_unique oder std::make_shared

Aber da du auch dort um die Angabe des Typs nicht herumkommst, schließe ich mich diesbezüglich SeppJ an.
-
SeppJ schrieb:
Logischerweise dürfte der erste Fall hier gar nicht vorkommen. Denn dort weißt du ja schon zur Compilezeit, was für ein Typ das ist und bräuchtest in der Folge weder einen gemeinsamen Container, noch Polymorphie. Ich will natürlich nicht ausschließen, dass genau dies der Fall ist; Polymorphie wird gerne benutzt, wo sie nicht nötig wäre.

Natürlich weiss ich bei Erzeugung welchen Typ ich erzeuge.
Erst später (an anderer Stelle) weiss ich es nicht mehr.
Geh von dutzenden verschiedenen Derived-Typen aus die an unterschiedlichen Stellen instanziert werden.
-
auto object = new Derived();
Problem gelöst
-
autogast schrieb:
auto object = new Derived();
Nice. Daran hatte ich noch gar nicht Gedacht

(Codebase ist älter)