Wann müssen wir einen default-Konstruktor?
Meine Frage ist einfach. Wann müssen wir einen default-Konstruktor?
Bitte entnehmen Sie den folgenden code:
class Shape
{
int k;
public:
Shape(int n) : k(n) {}
~Shape() {}
};
class Rect : public Shape
{
int l;
public:
Rect(int n): l(n)
{} //error C2512: 'Shape' : no appropriate default constructor available
~Rect() {}
};
- Warum der compiler nicht die Erzeugung der null-argument default-Konstruktors implizit in der Klasse Rect?
- Laut meines Wissens, wenn eine Klasse (Rect) ist abgeleitet von einer anderen Klasse (Form), der hat default-Konstruktor (implizit generiert oder explizit), wird der default-Konstruktor erzeugt werden sollen, durch den compiler.
InformationsquelleAutor der Frage XMarshall | 2011-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen default-Konstruktor wird nicht synthetisiert, wenn Sie erstellt Ihre eigenen Konstruktor mit Argumenten. Da Gaben Sie
Shape
einen Konstruktor der eigenen, müsste man explizit schreiben, eine Standard -Shape
Konstruktor nun:(Können Sie weglassen, die leere
~Rect() {}
Definitionen, wie diese synthetisiert werden.)Allerdings sieht es für mich wie Sie nicht wollen einen default-Konstruktor für das Form hier. Haben
Rect
Konstrukt derShape
base richtig:Beachten Sie auch, dass diesem Beispiel ist oft zitiert als ein Missbrauch von OO. Überlegen Sie, ob Sie wirklich brauchen Vererbung hier.
InformationsquelleAutor der Antwort Lightness Races in Orbit
Einen default-Konstruktor wird nur automatisch vom compiler generiert, wenn keine anderen Konstruktoren definiert sind. Unabhängig von der Vererbung.
Und auch Sie brauchen, um zu konstruieren, Ihre Basis-Klasse durch den Aufruf:
InformationsquelleAutor der Antwort Nick
Sehen, die full-Verhalten von C++ - WRT Konstruktoren: http://en.wikipedia.org/wiki/Default_constructor
Die einfache Antwort ist, dass, wenn Sie geben Sie einen Konstruktor, den der compiler nicht erstellen Sie eine Standard für Sie.
Diese Regel gilt für Java als auch.
InformationsquelleAutor der Antwort Mike Thomsen
Den compiler definiert einen Standard-ctor, wenn, und nur wenn Sie nicht explizit deklarieren alle ctors.
Beachten Sie, dass das, was wichtig ist, ist deklarieren den Konstruktor, nicht unbedingt, es zu definieren. Es ist ziemlich normal, zum Beispiel, zu erklären, eine private Tor, und nie definieren, um zu verhindern, dass der compiler implizit aus der Definition jeder andere.
Edit: Auch beachten Sie, dass C++11 hat eine
=default
syntax für den Umgang mit Situationen wie die Ihre.InformationsquelleAutor der Antwort Jerry Coffin
Den default-Konstruktor wird nur erzeugt, wenn Sie nicht definiert haben irgendwelche anderen Konstruktoren.
Angeblich, wenn Sie einige spezielle Initialisierung in der Klasse, der Standard-Konstruktor nicht die richtige.
InformationsquelleAutor der Antwort Bo Persson
Wie Sie definiert einen Konstruktor der Form erwartet eine ganze Zahl, die Sie überschrieben haben, die default-Konstruktor, indem Sie so tun. Also, wenn Sie erweitern Form übergeben Sie müssen einen integer-Wert der Superklasse.
InformationsquelleAutor der Antwort das_weezul
Compiler erzeugt default-Konstruktor im Fall, wenn Sie nicht definieren, jeder Konstruktor. Aber wenn Sie definiert haben, in jedem Konstruktor, einige argument oder nicht. Der compiler diesen Konstruktor verwenden und wird nicht erzeugen-default-Konstruktor mit null-argument.
InformationsquelleAutor der Antwort Sarfraz Ahmed