在子类中显示的调用父类的有参构造函数的方法

转载 2013年12月04日 21:34:57

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。

如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。

构造原则如下:

    1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法。

    2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。

    3. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。

    4. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构造函数。

    5. 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类只定义了自己的有参构造函数,则会出错(如果父类只有有参数的构造方法,则子类必须显示调用此带参构造方法)。

    6. 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,比如:

     

  1. #include <iostream.h>  
  2.  class animal  
  3.  {  
  4.  public:  
  5.    animal(int height, int weight)  
  6.    {  
  7.      cout<<"animal construct"<<endl;  
  8.    }  
  9.    …  
  10.  };  
  11.  class fish:public animal  
  12.  {  
  13.  public:  
  14.    fish():animal(400,300)  
  15.    {  
  16.      cout<<"fish construct"<<endl;  
  17.    }  
  18.    …  
  19.  };  
  20.  void main()  
  21.  {  
  22.    fish fh;  
  23.  }  

  在fish类的构造函数后,加一个冒号(:),然后加上父类的带参数的构造函数。这样,在子类的构造函数被调用时,系统就会去调用父类的带参数的构造函数去构造对象。



例外像MFC常见的CDialog继承可以看到这种例子..


头文件中


  1. #pragma once  
  2. class CDrugDlg : public CDialogEx  
  3. {  
  4.     DECLARE_DYNAMIC(CDrugDlg)  
  5.   
  6.   
  7. public:  
  8.     CDrugDlg(CWnd* pParent = NULL);   // 标准构造函数  
  9.     virtual ~CDrugDlg();  
  10.   
  11.   
  12. // 对话框数据  
  13.     enum { IDD = IDD_DRUG_DIALOG };  
  14.   
  15. protected:  
  16.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持  
  17.   
  18.   
  19.     DECLARE_MESSAGE_MAP()  
  20. public:  
  21.     afx_msg void OnSize(UINT nType, int cx, int cy);  
  22.     virtual BOOL OnInitDialog();  
  23.     afx_msg void OnPaint();  
  24.     afx_msg void OnDestroy();  
  25. };  



实现文件

  1. // DrugDlg.cpp : 实现文件  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "Medical.h"  
  6. #include "DrugDlg.h"  
  7. #include "afxdialogex.h"  
  8.   
  9. // CDrugDlg 对话框  
  10.   
  11. IMPLEMENT_DYNAMIC(CDrugDlg, CDialog)  
  12.   
  13. CDrugDlg::CDrugDlg(CWnd* pParent /*=NULL*/)  
  14.     :CDialogEx(CDrugDlg::IDD, pParent)  
  15. {  
  16.   
  17. }  
  18.   
  19. CDrugDlg::~CDrugDlg()  
  20. {  
  21. }  




这种初始化方式,还常用来对类中的常量(const)成员进行初始化,如下面的代码所示:

  1. class point  
  2.   {  
  3.   public:  
  4.      point():x(0),y(0)  
  5.   private:  
  6.      const int x;  
  7.      const int y;  
  8.   };  


  当然,类中普通的成员变量也可以采取此种方式进行初始化,然而,这就没有必要了..

相关文章推荐

何时子类必须显示调用父类带参构造函数

子类显示调用父类带参构造函数

抽象父类在构造函数中调用抽象方法,子类全局变量必须使用“static”来修饰

测试代码: 抽象父类:

java继承中父类和子类静态、非静态代码块,构造函数,静态方法的执行顺序

java继承中父类和子类静态、非静态代码块,构造函数,静态方法的执行顺序

C++子类调用父类构造函数

转自:http://blog.csdn.net/scottly1/article/details/25594439   构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继...

Java 子类调用父类构造函数----super()详解

Java 子类调用父类构造函数----super()详解

关于父类与子类的构造函数调用顺序

关于父类与子类的构造函数调用顺序

在子类中调用父类的带参数的构造函数

下面我们修改一下animal类的构造函数,增加两个参数height和weight,分别表示动物的高度和重量。代码如例2-13所示。  例2-13  #include   class animal  {...

C++子类如何调用父类构造函数

在C++中子类继承和调用父类的构造函数方法     构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,...

在子类中调用父类的带参数的构造函数

http://tech.ddvip.com/2008-11/122750550394593.html 下面我们修改一下animal类的构造函数,增加两个参数height和weight...

C++子类调用父类构造函数

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)