Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Order of calling constructors/destructors in inheritance

A little question about creating objects. Say I have these two classes:

struct A{     A(){cout << "A() C-tor" << endl;}     ~A(){cout << "~A() D-tor" << endl;} };  struct B : public A{     B(){cout << "B() C-tor" << endl;}     ~B(){cout << "~B() D-tor" << endl;}      A a; }; 

and in main I create an instance of B:

int main(){     B b; } 

Note that B derives from A and also has a field of type A.

I am trying to figure out the rules. I know that when constructing an object first calls its parent constructor, and vice versa when destructing.

What about fields (A a; in this case)? When B is created, when will it call A's constructor? I haven't defined an initialization list, is there some kind of a default list? And if there's no default list? And the same question about destructing.

like image 347
Bug Avatar asked Sep 24 '11 13:09

Bug


People also ask

In what order are constructors and destructors called in case of inheritance?

For multiple inheritance order of constructor call is, the base class's constructors are called in the order of inheritance and then the derived class's constructor.

What is the order of execution of constructor and destructor?

Answer: the order of execution of constructor and destructor call in c# inheritance: The constructor call is from top to bottom i.e. from base class to the derive class. And the destructor call is in reverse order i.e. from bottom to the top.

What order are destructors called?

Destructors for virtual base classes are called in the reverse order of declaration.

In what order destructors are executed in the inheritance hierarchy?

Class E (member object 1) destructor is called and finishes. Class C (base of F) destructor is called and finishes.


1 Answers

  • Construction always starts with the base class. If there are multiple base classes then, construction starts with the left most base. (side note: If there is a virtual inheritance then it's given higher preference).
  • Then the member fields are constructed. They are initialized in the order they are declared
  • Finally, the class itself is constructed
  • The order of the destructor is exactly the reverse

Irrespective of the initializer list, the call order will be like this:

  1. Base class A's constructor
  2. class B's field named a (of type class A) will be constructed
  3. Derived class B's constructor
like image 168
iammilind Avatar answered Sep 22 '22 04:09

iammilind