El método constructor se utiliza para inicializar los objetos de la clase. A diferencia de otros miembros de la clase padre, no puede ser heredado por la subclase (la subclase puede heredar todas las variables miembro y métodos miembro de la clase padre, pero no hereda el método constructor de la clase padre). Por lo tanto, al crear un objeto de la subclase, para inicializar los miembros de datos heredados de la clase padre, el sistema necesita llamar al método constructor de su clase padre.

Si no hay un constructor explícito, el compilador proporciona un constructor predeterminado, y este constructor predeterminado solo se crea cuando no se ha declarado explícitamente ningún constructor.

Los principios de construcción son los siguientes:

  • 1. Si la subclase no define un método constructor, se llama al método constructor sin parámetros de la clase padre.
  • 2. Si la subclase define un método constructor, ya sea sin parámetros o con parámetros, al crear un objeto de la subclase, primero se ejecuta el método constructor sin parámetros de la clase padre y luego se ejecuta su propio método constructor.
  • 3. Al crear un objeto de la subclase, si el constructor de la subclase no llama explícitamente al constructor de la clase padre, se llamará al constructor predeterminado sin parámetros de la clase padre.
  • 4. Al crear un objeto de la subclase, si el constructor de la subclase no llama explícitamente al constructor de la clase padre y la clase padre proporciona su propio constructor sin parámetros, se llamará al constructor sin parámetros de la propia clase padre.
  • 5. Al crear un objeto de la subclase, si el constructor de la subclase no llama explícitamente al constructor de la clase padre y la clase padre solo define su propio constructor con parámetros, se producirá un error (si la clase padre solo tiene un método constructor con parámetros, la subclase debe llamar explícitamente a este método constructor con parámetros).
  • 6. Si la subclase llama al método constructor con parámetros de la clase padre, debe hacerlo mediante la inicialización de los objetos miembro de la clase padre, por ejemplo:

Ejemplo

#pragma once class CDrugDlg : public CDialogEx { DECLARE_DYNAMIC(CDrugDlg) public: CDrugDlg(CWnd* pParent = NULL); // Constructor estándar virtual ~CDrugDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_DRUG_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // Soporte DDX/DDV DECLARE_MESSAGE_MAP() public: afx_msg void OnSize(UINT nType, int cx, int cy); virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg void OnDestroy(); };

Después del constructor de la clase fish, añade un signo de dos puntos:y luego añade el constructor con parámetros de la clase padre. De esta manera, cuando se llama al constructor de la subclase, el sistema llamará al constructor con parámetros de la clase padre para construir el objeto.

Por ejemplo, en la herencia de CDialog, común en MFC, se puede ver este tipo de ejemplo..

Ejemplo

#pragma once class CDrugDlg : public CDialogEx { DECLARE_DYNAMIC(CDrugDlg) public: CDrugDlg(CWnd* pParent = NULL); // Constructor estándar virtual ~CDrugDlg(); // Datos del cuadro de diálogo enum { IDD = IDD_DRUG_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // Soporte DDX/DDV DECLARE_MESSAGE_MAP() public: afx_msg void OnSize(UINT nType, int cx, int cy); virtual BOOL OnInitDialog(); afx_msg void OnPaint(); afx_msg void OnDestroy(); };

Archivo de implementación

Ejemplo

// DrugDlg.cpp : Archivo de implementación // #include "stdafx.h" #include "Medical.h" #include "DrugDlg.h" #include "afxdialogex.h" // Diálogo CDrugDlg IMPLEMENT_DYNAMIC(CDrugDlg, CDialog) CDrugDlg::CDrugDlg(CWnd* pParent /*=NULL*/) :CDialogEx(CDrugDlg::IDD, pParent) { } CDrugDlg::~CDrugDlg() { }

Este método de inicialización también se utiliza a menudo para inicializar miembros constantes (const) de la clase, como se muestra en el siguiente código:

Ejemplo

class point {   public:      point():x(0),y(0)   private:      const int x;      const int y; };

Por supuesto, las variables miembro ordinarias de la clase también pueden inicializarse de esta manera, sin embargo, esto no es necesario..

Fuente: http://blog.jobbole.com/109500/