2012-11-19 17 views
5

Jeśli mam klasę bazową:Pochodzące klasy Konstruktor wywołuje

class Base{ 
    ... 
}; 

i klasę pochodną

class Derived : public Base{ 
    ... 
} 

nie ta klasa pochodzi zawsze zadzwonić domyślny konstruktor klasy bazowej? tj. konstruktor, który nie przyjmuje parametrów? Na przykład, jeśli I zdefiniować konstruktor klasy bazowej:

Base(int newValue); 

ale nie definiują domyślny konstruktor (konstruktora bez parametrów):

Base(); 

(uznaję to tylko deklaracja, a nie definicja) Otrzymuję błąd, dopóki nie zdefiniuję domyślnego konstruktora, który nie przyjmuje parametrów. Czy to dlatego, że domyślnym konstruktorem klasy bazowej jest ten, który jest wywoływany przez klasę pochodną?

+0

Możesz sprawdzić, ustawiając domyślny konstruktor w klasie bazowej, drukuj coś unikalnego na ekranie. To jest dobry sposób, aby sprawdzić takie rzeczy i nauczyć się rzeczy! –

Odpowiedz

9

Tak, domyślnie wywoływany jest domyślny konstruktor. Można to obejść przez jawne wywołanie inny niż domyślny konstruktor:

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

To wywoła konstruktor bazowy, który przyjmuje parametr i nie trzeba już deklarować konstruktora domyślnego w klasie bazowej.

1

Powodem, dla którego wywoływany jest domyślny konstruktor, jest to, że w przypadku, gdy utworzyłeś jakiś obiekt i w tej instancji nie przekazałeś argumentów (możesz zainicjować je później w programie). Jest to najbardziej ogólny przypadek, dlatego konieczne jest wywoływanie domyślnego konstruktora.

1

Przez domyślny kompilator dostarczyć trzy domyślne:

  1. domyślna (bez parametrów) konstruktor

  2. skopiować konstruktor

  3. operatora przypisania

W przypadku, jeśli sam dostarczyć sparametryzowane Ctor lub Copy Ctor następnie comp iler nie daje domyślnego Ctor, więc musisz jawnie napisać Default Ctor.

Kiedy tworzymy obiekt klasy pochodnej domyślnie wyszukujemy domyślnego Ctor'a Base i jeśli go nie podamy, kompilator zgłasza błąd. Możemy jednak uczynić klasy pochodnej Ctor, aby wywoływał naszego określonego Base Ctor.

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

Tak, domyślnie wywoływany jest domyślny konstruktor. Jednak w przypadku, gdy klasa bazowa paramterized konstruktora następnie możesz zadzwonić non domyślnego konstruktora dwojako .:

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

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

Opcja 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(){} 
}; 

powyżej podejście będzie działać dobrze dla obu paramterized powołaniu konstruktora i domyślne Wywołanie konstruktora.

Powiązane problemy