派生类与基类的构造函数

来源:互联网 发布:extend python 编辑:程序博客网 时间:2024/06/05 01:09

1.3.2  派生类与基类的构造函数

派生类对象在建立时,先执行基类的构造函数,然后执行派生类的构造函数。但对于析构函数来说,其顺序正好相反,先执行派生类的析构函数,然后执行基类的析构函数。注意,基类的构造函数和析构函数不能被派生类继承。

如果在对派生类进行初始化时,需要对其基类设置初值,其格式如下:

  1. 派生类名(总参表):基类1(参数表1),基类2(参数表2),...,基类n(参数表n),对象成员1(对象成员参数表1),对象成员2(对象成员参数表2),...,对象成员n(对象成员参数表n) 

其中,构造函数总参表后面给出的是需要用参数初始化的基类名、对象成员名及各自对应的参数表,基类名和对象成员名之间的顺序可以是任意的,且对于使用默认构造函数的基类和对象成员可以不列出基类名和对象成员名。

这里所说的对象成员是指在派生类中新声明的数据成员,它属于另外一个类的对象。对象成员必须在初始化列表中进行初始化。

【例1.9】演示派生类的构造函数执行顺序(Ex1_09):

  1. #include <iostream.h>  
  2. class parent  
  3. {  
  4. public:  
  5. parent( )  
  6. {cout<<"先执行基类构造函数parent()"<<endl;}  
  7. };  
  8.  
  9. class child : public parent  
  10. {  
  11. public:  
  12. child()  
  13. { cout<<"再执行派生类构造函数child()"<<endl; }  
  14. };  
  15.  
  16. void main()  
  17. {   
  18. child ob;  

运行结果为:

  1. 先执行基类构造函数parent()  
  2. 再执行派生类构造函数child() 

【例1.10】用初始化表向基类的构造函数传递参数(Ex1_10):

  1. #include <iostream.h>  
  2. class Box  
  3. {  
  4. private:    
  5. int  width, height;  
  6. public:   
  7. Box(int w1, int h1) { width=w1;  height=h1; }  
  8. void SetWidth(int w) { width=w; }  
  9. void SetHeight(int h) { height=h; }  
  10. };  
  11. class ColorBox : public Box               // public公有派生  
  12. {  
  13. private:  
  14. int color;  
  15. public:  
  16. ColorBox(int c, int w, int h) : Box(w, h)  // 初始化表的使用  
  17. {  
  18. cout<<"执行ColorBox构造函数"<<endl;  
  19. color = c;  
  20. cout<< color <<endl;  
  21. }  
  22. void SetColor(int c) { color = c; }  
  23. };  
  24.  
  25. void main()  
  26. {   
  27. ColorBox a(3, 1, 2);    // 定义派生类的对象,分配内存,初始化数据成员  

运行结果为:

  1. 执行ColorBox构造函数  

生成a对象时,其中通过初始化表Box(w, h)将派生类的构造函数中的w, h值传给基类的构造函数Box(int w1, int h1)中参数w1, h1,从而实现对继承来的数据成员width、height初始化。

如果派生类的构造函数中省去了初始化表,则自动调用基类的默认构造函数。所以基类必须拥有默认的构造函数,否则会出错。

原创粉丝点击