Dotcpp  >  编程教程  >  C++继承与派生  >  C++派生类的构造函数实例详解

C++派生类的构造函数实例详解

点击打开在线编译器,边学边练

由于派生类包含基类的原因,我们在创建一个派生类的时候,系统会先创建一个基类。需要注意的是,派生类会吸纳基类的全部成员,但并不包括构造函数及后面讲的析构函数,那么就意味着创建派生类在调用自己的构造函数之前,会先调用基类的构造函数


这里一点我们可以通过代码验证:

#include<iostream>
using namespace std;
class Clock
{
private:
    int H;
    int M;
    int S;
public:
    Clock()
    {
        cout<<"Clock's Constructor Called!"<<endl;
    }
 
};
 
class AlarmClock:public Clock
{
private:
    int AH;
    int AM;
public:
    AlarmClock()
    {
        cout<<"AlarmClock's Constructor Called!"<<endl;
    }
 
};
 
int main()
{
    AlarmClock A;
 
    return 0;
}


运行截图如下:

C++派生类的构造函数


我们可以看到仅仅定义了一个派生类对象,派生类和基类的构造函数会自动调用,调用顺序是先调用基类的构造函数再调用派生类的构造函数


以上大家看到的是最常见也最简单的调用方法,这仅仅是隐式的,也就是不用写出来的、自动的调用。那么当基类的构造函数是带参数的情况下如何调用呢?这样还可以吗?如何传参呢?


答:那就需要我们显式的,也就是明确的写出来,并指定参数传递,来告诉编译器。


一般的写法格式为:

派生类构造函数名(总形参表列):基类构造函数(实参表列)


例如代码:

#include<iostream>
using namespace std;
class Clock
{
private:
    int H;
    int M;
    int S;
public:
    Clock()
    {
        cout<<"Clock's Constructor Called!"<<endl;
    }
    Clock(int h,int m,int s)
    {
        this->H = h;
        this->M = m;
        this->S = s;
        cout<<"Clock's Constructor  with  parameter Called!"<<endl;
    }
 
};
class AlarmClock:public Clock
{
private:
    int AH;
    int AM;
public:
    AlarmClock()
    {
        cout<<"AlarmClock's Constructor Called!"<<endl;
    }
    AlarmClock(int h,int m,int s):Clock(h,m,s)
    {
        cout<<"AlarmClock's Constructor  with  parameter Called!"<<endl;
    }
};
int main()
{
    AlarmClock A(8,10,30);
    AlarmClock B;
    return 0;
}


大家注意看派生类的构造函数,后面通过冒号跟基类的传参,且基类里的参数里为实参,来实现显示的参数调用。请大家上机实践!


需要注意的是,一旦基类中有带参数的构造函数,派生类中则必须有显式传参的派生类构造函数,来实现基类中参数的传递,完成初始化工作。



本文固定URL:https://www.dotcpp.com/course/76

C++教程
第一章 C++入门
第二章 C++表达式和控制语句
第三章 C++函数调用与重载、内联
第四章 C++类和对象
第五章 C++继承与派生
第六章 C++多态性
第七章 C++异常处理
第八章 C++文件操作
Dotcpp在线编译      (登录可减少运行等待时间)