c++ 子类构造函数初始化及父类构造初始化

  咱们知道,构造方法是用来初始化类对象的。若是在类中没有显式地声明构造函数,那么编译器会自动建立一个默认的构造函数;而且这个默认的构造函数仅仅在没有显式地声明构造函数的状况下才会被建立建立。函数

  构造函数与父类的其它成员(成员变量和成员方法)不一样,它不能被子类继承。所以,在建立子类对象时,为了初始化从父类中继承来的成员变量,编译器须要调用其父类的构造函数。若是子类的构造函数没有显示地调用父类的构造函数,则默认调用父类的无参构造函数,至于什么事显式调用,在下面会详细说明!关于子类中构造函数的构造原则,总结以下,欢迎你们指导与批评。this

  1.父类没有声明构造函数spa

    (1)子类也没有声明本身的构造函数,则父类和子类均由编译器生成默认的构造函数。3d

    (2)子类中声明了构造函数(无参或者带参),则子类的构造函数能够写成任何形式,不用顾忌父类的构造函数。在建立子类对象时,先调用父类默认的构造函数(编译器自动生成),再调用子类的构造函数。code

  2.父类只声明了无参构造函数对象

    若是子类的构造函数没有显式地调用父类的构造,则将会调用父类的无参构造函数。也就是说,父类的无参构造函数将会被隐式地调用。blog

  3.父类只声明了带参构造函数继承

    在这种状况下,要特别注意。由于父类只有带参的构造函数,因此若是子类中的构造函数没有显示地调用父类的带参构造函数,则会报错,因此必需显示地调用。关于构造函数的显示调用,参见下例。编译器

 1 class animal  2 {  3 protected:       //成员变量,声明为protected或者public,这里选择protected
 4     int height;  //若声明为private,则不能被子类继承访问,会报错
 5     int weight;  6 public:  7     animal(int height,int weight)   //带参的构造函数
 8  {  9         this->height=height; 10         this->weight=weight; 11         cout<<"animal的带参构造函数被调用"<<endl; 12  } 13     virtual ~animal() 14  { 15         cout<<"animal的析构函数被调用"<<endl; 16  } 17 }; 18 //子类
19 class fish:public animal 20 { 21 public: 22     fish():animal(height,weight) //显示调用父类的构造函数
23  { 24         cout<<"fish的构造函数被调用"<<endl; 25  } 26     virtual ~fish() 27  { 28         cout<<"fish的析构函数被调用"<<endl; 29  } 30 };

  在子类fish的构造函数中,加上一个冒号(:),而后加上父类的带参构造函数,这就是父类构造函数的显式调用。这样,在子类的构造函数被调用时,系统就会去调用父类的带参构造函数,从而实现初始化父类的成员变量。运行结果以下:编译

  4.父类同时声明了无参和带参构造函数

    在这种状况下,子类只须要实现父类的一个构造函数便可,无论是无参的仍是带参的构造函数。若是子类的构造函数没有显示地调用父类的构造函数(无参或带参),则默认调用父类的无参构造函数。

 1 //父类
 2 class animal
 3 {
 4 protected:       //成员变量,声明为protected或者public,这里选择protected
 5     int height;  //若声明为private,则不能被子类继承访问,会报错
 6     int weight;
 7 public:    
 8     animal()
 9     {
10         height=0;
11         weight=0;
12         cout<<"animal的无参构造函数被调用"<<endl;
13     }
14     animal(int height,int weight)   //带参的构造函数
15     {
16         this->height=height;
17         this->weight=weight;
18         cout<<"animal的带参构造函数被调用"<<endl;
19     }
20     virtual ~animal()
21     {
22         cout<<"animal的析构函数被调用"<<endl;
23     }
24 };
25 //子类
26 class fish:public animal
27 {
28 public:
29     fish()     //没有显示地调用父类的构造函数(无参或带参),则默认调用父类的无参构造函数
30     {
31         cout<<"fish的构造函数被调用"<<endl;
32     }
33     virtual ~fish()
34     {
35         cout<<"fish的析构函数被调用"<<endl;
36     }
37 };

  运行结果以下:

  总结以上几条,能够概括出C++中子类继承父类时构造函数的写法的规律:当父类有显式地声明了构造函数时,子类最低限度的实现父类中的一个;当父类没有声明构造函数时,子类能够不声明构造函数或者任意地书写构造函数。

相关文章
相关标签/搜索