C++派生类的构造函数和析构函数

C++派生类的构造函数和析构函数

派生类的构造函数和析构函数

#include <iostream>
 
 
using namespace std;
 
 
class student
{
public:
    student(int num,char* n):number(num),name(n){}
    ~student(){cout << "student deconstruted" << endl;}
protected:
    int number;
    char* name;
};
 
 
class student1:public student
{
public:
    student1(int num,char* n,bool s,int a):student(num,n),sex(s),age(a){}
    void show();
    ~student1(){cout << "student1 deconstruted" << endl;}
protected:
    bool sex;
    int age;
};
 
 
void student1::show()
{
    cout << "num: " << number << endl;
    cout << "name: " << name << endl;
    cout << "age: " << age << endl;
    cout << "sex: " << sex << endl;
}
 
 
int main()
{
    student1 stu(45,"shukai",true,20);
    stu.show();
    return 0;
}
 
 
 1.1派生类构造函数的一般形式为: 
派生类构造函数名(总参数表列):基类构造函数名(参数表列)
{派生类新增加的成员的初始化语句}
1.2对派生类新增加的成员可以用初始化表进行初始化。如:
student1(int num,char* n,bool s,int a):student(num,n),sex(s),age(a){}
1.3在类中对派生类构造函数做声明时,不包括基类构造函数名以及参数表列(student(num,n)),只在定义函数时将它列出。
1.4建立一个对象时,执行构造函数的顺序:
A.派生类构造函数调用基类的构造函数。
B.再执行派生类构造函数体本身(即派生类构造函数的函数体)

有子对象的派生类构造函数

#include <iostream>
 
  
using namespace std;
 
  
class student
{
public:
    student(int n,char* nam):num(n),name(nam){}
    void display(){cout << name << " " << num << endl;}
protected:
    int num;
    char* name;
};
 
  
class student1:public student
{
public:
    student1(int n,char* nam,int n1,char* nam1,int a,bool s):student(n,nam),
        monitor(n1,nam1),age(a),sex(s){}
    void display1();
    void display_monitor();
private:
    int age;
    bool sex;
    student monitor;
};
 
  
void student1::display1()
{
    cout << "student is " << endl;
    display();
    cout << age << " " << sex << endl;
}
 
  
void student1::display_monitor()
{
    cout << "monitor is " << endl;
    cout << age << " " << sex << endl;
}
 
  
int main()
{
    student1 stu(45,"shukai",1,"abc",20,true);
    stu.display1();
    stu.display_monitor();
    return 0;
}
 
  
 
  

1.1类的数据成员除了标准成员,如(int,char)或系统提供的类型(如string),实际上,类的数据成员中还可以包含类对象,如可以声明一个类时包含这样的数据成员:
Student s1;
这时,s1就是类对象中的内嵌对象,称为子对象(subobject)。
1.2派生类构造函数的任务应该包括3部分:
A.对基类成员的初始化
B.对子对象数据成员的初始化。
C.对派生类数据成员的初始化。
1.3定义派生类构造函数的一般形式为:
派生类构造函数名(总参数表列);基类构造函数名(参数表列),子对象名(参数表列)
{派生类中新增数据成员的初始化语句}
如:student1(int n,char* nam,int n1,char* nam1,int a,bool s):student(n,nam),monitor(n1,nam1),age(a),sex(s){}
只不过派生类中的新生成员用初始化列表来进行初始化而已。
1.4基类构造函数和子对象的次序是可以任意的,如上面的构造函数可以写成:
student1(int n,char* nam,int n1,char* nam1,int a,bool s):monitor(n1,nam1),student(n,nam),age(a),sex(s){}
编译系统是根据相同的参数名,而不是根据参数的次序来传递数据的。

多层派生时的构造函数

#include <iostream>
#include <string>
 
 
using namespace std;
 
 
class student
{
public:
    student(int n,string nam){num=n;name=nam;}
    void display(){cout << "num: " << num << " name: " << name << endl;}
protected:
    int num;
    string name;
};
 
 
class student1:public student
{
public:
    student1(int n,string nam,int a):student(n,nam),age(a){}
    void display1(){display();cout << "age: " << age << endl;}
protected:
    int age;
};
 
 
class student2:public student1
{
public:
    student2(int n,string nam,int a,bool s):student1(n,nam,a),sex(s){}
    void display2(){display1();cout << "sex: " << sex << endl;}
protected:
    bool sex;
};
 
 
int main()
{
    student2 stu(45,"shukai",20,true);
    stu.display2();
    return 0;
}
 
 
 1.1 student2的构造函数为student2(int n,string nam,int a,bool s):student1(n,nam,a),sex(s){},注意不必列出每一层的构造函数,只要列出上一层的构造函数即可。 

派生类构造函数的特殊形式

1.1当不需要对派生类新增成员做任何初始化操作的时候,派生类构造函数的函数体可以为空,即构造函数是空函数。
1.2如果在基类中没有构造函数或者定义了没有参数的构造函数,那么在定义派生类的构造函数时可以不必写基类的构造函数。

派生类的析构函数

1.1析构函数与派生类的构造函数相反,构造函数是先构造基类在构造子对象再构造派生类,而析构时,先对派生类析构,再对子对象析构,然后再对基类析构。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值