在C++中子类继承和调用父类的构造函数方法

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

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

构造原则如下:

    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.   };  


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值