2012-11-19 5 views
5

Wenn ich eine Basisklasse:Abgeleitete Klasse Konstruktoraufrufe

class Base{ 
    ... 
}; 

und eine abgeleitete Klasse

class Derived : public Base{ 
    ... 
} 

ist diese abgeleitete Klasse des Standard-Konstruktor der Basisklasse immer anrufen? d.h. der Konstruktor, der keine Parameter annimmt? Wenn ich einen Konstruktor für die Basisklasse zum Beispiel definieren:

Base(int newValue); 

aber ich habe nicht den Standard-Konstruktor (der parameterlosen Konstruktor) definieren:

Base(); 

(ich erkennen, dass dies nur eine Erklärung und nicht eine Definition) Ich bekomme einen Fehler, bis ich den Standardkonstruktor definiere, der keine Parameter nimmt. Liegt das daran, dass der Standardkonstruktor einer Basisklasse von einer abgeleiteten Klasse aufgerufen wird?

+0

Sie können überprüfen, indem Sie den Standardkonstruktor in der Basisklasse etwas drucken, das auf dem Bildschirm einzigartig ist. Dies ist eine gute Möglichkeit, Dinge wie diese zu überprüfen, und Sie lernen Dinge zu lernen! –

Antwort

9

Ja, standardmäßig wird der Standard-Konstruktor aufgerufen. Sie können durch expliziten Aufruf einer Nicht-Standard-Konstruktor, um dieses gehen:

class Derived : public Base{ 
    Derived() : Base(5) {} 
}; 

Dies wird die Basis Konstruktor aufrufen, die einen Parameter nimmt und nicht mehr den Standard-Konstruktor in der Basisklasse deklarieren müssen.

1

Der Grund, warum Standardkonstruktors genannt wird, ist, dass im Fall, wenn Sie ein beliebiges Objekt erstellt haben, und in diesem Fall haben Sie keine Argumente übergeben (Sie können sie später im Programm initialisieren). Dies ist der allgemeinste Fall, deshalb ist der Aufruf des Standardkonstruktors notwendig.

1

standardmäßig Compiler bieten drei Standardeinstellungen:

  1. Standard (parameterlos) Ctor

  2. Copy Ctor

  3. Zuweisungsoperator

Im Fall, wenn Sie sich zur Verfügung stellen parametrierte Ctor oder Kopie Ctor dann comp iler gibt nicht Standard-Ctor, so dass Sie explizit Default Ctor schreiben müssen.

Wenn wir eine abgeleitete Klasse Objekt, um es durch Standardwerte Suche für Base-Standard Ctor erstellen und wenn wir nicht zur Verfügung gestellt haben es dann Fehler Compiler wirft. Jedoch können wir die abgeleitete Klasse Ctor dazu bringen, unseren spezifizierten Basis-Ctor aufzurufen.

class Base { 
public: 
Base(int x){} 
}; 

class Derived { 
public: 
Derived():Base(5){}    //this will call Parameterized Base Ctor 
Derived(int x):Base(x){}  //this will call Parameterized Base Ctor 
} 
0

Ja, standardmäßig wird der Standardkonstruktor aufgerufen. Aber falls Sie Ihre Basisklasse hat paramterized Konstruktor, dann können Sie nicht Standardkonstruktors auf zwei Arten aufrufen .:

option 1: by explicitly calling a non-default constructor: 

class Derived : public Base{ 
Derived() : Base(5) {} 
}; 

Option 2:

in base class constructor set the parameter default value to 0, so it will 
act as default as well as paramterized constructor both 

for example: 

class base 
{ public: 
base(int m_a =0){} 
}; 

class Derived 
{ public: 
Derived(){} 
}; 

oben Ansatz wird sowohl für paramterized Konstruktor aufrufen und Standard funktionieren Konstruktor aufrufen.