Virtuelle Funktion aus Konstruktor - hier well-defined?
-
Ja, sobald die Initialisierungsliste abgeschlossen und der Inhalt des Konstruktors ausgeführt wird, ist es definiert.
Ich hatte allerdings erst vor zwei Tagen das Problem, dass im Konstruktor einer Basisklasse eine virtuelle Funktion aufgerufen wurde. Das führte zu der Meldung "pure virtual function called".§10.4/6 schrieb:
Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor (or destructor) is undefined.
-
Arcoth schrieb:
Ja, sobald die Initialisierungsliste abgeschlossen und der Inhalt des Konstruktors ausgeführt wird, ist es definiert.
Es wäre vorher auch definiert. Nur würde dann
Obj::LoadContentsaufgerufen.
-
hustbaer schrieb:
Arcoth schrieb:
Ja, sobald die Initialisierungsliste abgeschlossen und der Inhalt des Konstruktors ausgeführt wird, ist es definiert.
Es wäre vorher auch definiert. Nur würde dann
Obj::LoadContentsaufgerufen.Dieses Forum ist so vorhersehbar.
Ich hab mir schon gedacht, dass irgendeiner mit dieser Kleingikeit ankommt. :p
-
Dieses Forum ist so vorhersehbar.
War klar dass sich jemand darüber lustig machen wird, dass ein Fehler aufgezeigt wurde.
-
hustbaer schrieb:
Dieses Forum ist so vorhersehbar.
War klar dass sich jemand darüber lustig machen wird, dass ein Fehler aufgezeigt wurde.touché

-
dass ein Fehler aufgezeigt wurde.
Welcher Fehler? Ich habe nie bestritten, dass es vorher nicht definiert ist. Ich habe nur festgestellt, dass wenn der Rumpf des Konstruktors ausgeführt wird... .
-
@Arcoth und Nathan
Selbst kreidet ihr nicht selten jedes noch so irrelevante Detail an, aber wenn mal jemand was Bedeutsames sagt (ja, wann man eine Funktion aufrufen darf, halte ich für nicht ganz unwesentlich), startet ihr eine völlig nutzlose Grundsatzdiskussion. Und dann noch sich jedes Mal für Fehler rechtzufertigen, obwohl niemand überhaupt auf die Idee käme, einen Vorwurf darin zu sehen.Ist manchmal bemerkenswert, wie viele Posts wegen solcher Sinnlosdiskussionen entstehen und den Thread unnötig ins Offtopic treiben. Ich wäre sehr froh, wenn ihr etwas zurückhaltender posten könntet. Und Arcoth, man muss nicht ständig das letzte Wort zu allem haben -- du hast dauernd das Gefühl, dich beweisen zu müssen oder keine Fehler machen zu dürfen. Sieh doch das ein wenig lockerer; ist doch nichts dabei, wenn dein Post um eine Information ergänzt wird. Und wie gesagt sehe ich die Ergänzung hier durchaus als angebracht (im Gegensatz zu Posts, bei denen es nur um Rechthaberei oder Blossstellung geht).
-
Nexus schrieb:
@Arcoth und Nathan
Selbst kreidet ihr nicht selten jedes noch so irrelevante Detail an, aber wenn mal jemand was Bedeutsames sagt (ja, wann man eine Funktion aufrufen darf, halte ich für nicht ganz unwesentlich), startet ihr eine völlig nutzlose Grundsatzdiskussion. Und dann noch sich jedes Mal für Fehler rechtzufertigen, obwohl niemand überhaupt auf die Idee käme, einen Vorwurf darin zu sehen.Ist manchmal bemerkenswert, wie viele Posts wegen solcher Sinnlosdiskussionen entstehen und den Thread unnötig ins Offtopic treiben. Ich wäre sehr froh, wenn ihr etwas zurückhaltender posten könntet. Und Arcoth, man muss nicht ständig das letzte Wort zu allem haben -- du hast dauernd das Gefühl, dich beweisen zu müssen oder keine Fehler machen zu dürfen. Sieh doch das ein wenig lockerer; ist doch nichts dabei, wenn dein Post um eine Information ergänzt wird. Und wie gesagt sehe ich die Ergänzung hier durchaus als angebracht (im Gegensatz zu Posts, bei denen es nur um Rchthaberei oder Blossstellung geht).
Da die Frage eh geklärt ist, mach ich das OT weiter, ach wenn ich mich damit rechtfef und genau dem Bild oben entspreche.
Das, was hustbaer gesagt hatte, war komplett irrelevant.
Wir alle wussten, was der TE mit welldefined meinte. Das das so oder so, defined ist, ist ein kleiner Missgebrauch von Fachbegriffen.
Und ja, ich weiß, dass ich so etwas auch mache. Hätte ich auch getan. Ich finds nur witzug, dass sowas hier ständig passiert.
-
Erstmal vielen Dank für die (ersten beiden
) Antworten.Also, werden die überschriebenen Funktionen dann aufgerufen, wenn die Initialisierungsliste abgearbeitet ist, man also im Rumpf des Konstruktors von der Klasse ist, in der die Funktion auch überschrieben wurde, ja?
-
Nathan schrieb:
Das, was hustbaer gesagt hatte, war komplett irrelevant.
Wir alle wussten, was der TE mit welldefined meinte. Das das so oder so, defined ist, ist ein kleiner Missgebrauch von Fachbegriffen.Genau genommen war das was Arcoth geschrieben hat vollkommen irrelevant. Weil es hier keine virtual pure Funktionen gibt.
Deine Antwort dagegen war vollkommen OK. Kurz, ohne viele zusätzliche Details, aber zutreffend und IMO auch vollkommen ausreichend. Und die hab' ich ja auch nicht kommentiert/kritisiert/... .Und es ist auch vollkommen unmöglich zu wissen was der TE mit "welldefined" gemeint hat, da der TE diesen Begriff nirgends verwendet hat.
@Maxi
Ich kenne den Standard nicht auswendig, und werde jetzt auch nicht nachsehen, daher kann ich dir die passenden Fachausdrücke nicht liefern.
Bei Einfachvererbung ist es auf jeden Fall so, dass die virtuellen Funktionen einer Klasse verwendet werden, sobald der Konstruktor-Rumpf dieser Klasse angefangen hat zu laufen. D.h. sobald alle Member der Klasse vollständig konstruiert wurden.
Und beim Zerstören dann analog bis zu dem Zeitpunkt wo der Destruktor-Rumpf fertig abgearbeitet wurde, bzw. bis zu dem Zeitpunkt wo angefangen wird die Member zu zerstören.Ob es bei Mehrfachvererbung und/oder virtueller Vererbung hier noch spezielle Dinge zu beachten gibt weiss ich nicht, müsste ich nachlesen.
Im Prinzip kannst du dir merken: die virtuellen Funktionen einer Klasse sind immer dann "scharf", wenn sie sinnvoll aufgerufen werden können. Und das können sie natürlich nur, wenn alle Member der Klasse bereits konstruiert wurden und noch nicht wieder zerstört. Sonst könnte die Funktion ja nichtmal auf einzelne Member zugreifen.
-
hustbaer schrieb:
Nathan schrieb:
Das, was hustbaer gesagt hatte, war komplett irrelevant.
Wir alle wussten, was der TE mit welldefined meinte. Das das so oder so, defined ist, ist ein kleiner Missgebrauch von Fachbegriffen.Genau genommen war das was Arcoth geschrieben hat vollkommen irrelevant. Weil es hier keine virtual pure Funktionen gibt.
Deine Antwort dagegen war vollkommen OK. Kurz, ohne viele zusätzliche Details, aber zutreffend und IMO auch vollkommen ausreichend. Und die hab' ich ja auch nicht kommentiert/kritisiert/... .Und es ist auch vollkommen unmöglich zu wissen was der TE mit "welldefined" gemeint hat, da der TE diesen Begriff nirgends verwendet hat.
Ich bezog mich auch eher auf meinen zweiten Post, als ich mich darüber lustig gemacht habe, dass du eine irrelevante Kleinigkeit korriegiert hast.
Wie gesagt, dass ist kein Vorwurf, ich hätte es auch getan, nur ist es mir erst im Nachhinein aufgefallen.
-
Maxi, manchmal ist es auch nützlich zu wissen, wie solche "Limitationen" umgangen werden können. Teilweise wollen Leute im Basisklassenkonstruktor eine virtuelle Funktion aufrufen, die erst später (in abgeleiteten Konstruktoren) vernünftig funktioniert. Man will/kann aber vielleicht nicht in jeder abgeleiteten Klasse diese Funktion aufrufen -- z.B. weil es einfach vergessen werden kann.
Die typische Möglichkeit ist hier eine Factory: Eine Funktion erzeugt ein Objekt der Klasse und stellt sicher, dass die notwendigen Operationen ausgeführt sind.
P.S.: Einigen wir uns alle auf weniger Irrelevanz

-
Nexus schrieb:
Die typische Möglichkeit ist hier eine Factory: Eine Funktion erzeugt ein Objekt der Klasse und stellt sicher, dass die notwendigen Operationen ausgeführt sind.
Man nennt es auch Two Phase Construction

Und typischerweise wird dabei auch der Konstruktor private oder protected gemacht.