42派生类的构造函数和析构函数 当一个派生类有构造函数时,则它必须对自己的数据成员和 继承而来的基类数据成员初始化,这和前面(第三章)讲的类定义 中有对象作为数据成员类似。因此需要由派生类的构造函数调用 基类的构造函数来完成
4.2 派生类的构造函数和析构函数 当一个派生类有构造函数时,则它必须对自己的数据成员和 继承而来的基类数据成员初始化,这和前面(第三章)讲的类定义 中有对象作为数据成员类似。因此需要由派生类的构造函数调用 基类的构造函数来完成。 16
421派生类的构造函数和析构函数执行顺序 当创建派生类对象时,首先执行基类的构造函数,随后再执行 派生类的构造函数;当撤消派生类对象时,则先执行派生类的析 构函数,随后再执行基类的析构函数 例47 void maino) #include <iostream.h> i derie ol class base i public: base(){cout<<"执行base类的构造函数mn"i;} ~base(){cout<<"执行base类的析构函数m";} class derive: public base i public: dervied(:base(){cout<"执行 derie类的构造函数n";} derie(){cout<<"执行 derie类的析构函数n";}
4.2.1 派生类的构造函数和析构函数执行顺序 当创建派生类对象时,首先执行基类的构造函数,随后再执行 派生类的构造函数;当撤消派生类对象时,则先执行派生类的析 构函数,随后再执行基类的析构函数。 例4.7 #include <iostream.h> class base { public : base( ) { cout << "执行 base 类的构造函数\n"; } ~base( ) { cout <<"执行 base 类的析构函数\n"; } }; class derive:public base { public : dervie( ):base( ) { cout << "执行 dervie 类的构造函数\n"; } ~dervie( ) { cout <<"执行 dervie 类的析构函数\n"; } }; void main( ) { dervie op; } 17
422派生类的构造函数和析构函数的定义规则 当派生类的基类构造函数含有参数时,必须定义派生类的构造数。 格式为: 派生类的构造函数名(参数表基类的构造函数名(参数表) {1…}其中,基类构造函数参数,来源于派生类的构造函 数的参数表。 void main v 4.8#include <iostream. h> class base i i derive Int l obj(30,40) public baseline cout n, 以蓉图始羹构造函数m0D obj.showi( bse({cou<<"执行base基类的析构函效Ⅶ void showi(f cout <<end lass derive: public base derie(int n base(m dcout derie派生类的 鸦经的要数 dery Cot<行 derie派生类的析构函数n";} yold show cout <<end:
4.2.2 派生类的构造函数和析构函数的定义规则 当派生类的基类构造函数含有参数时,必须定义派生类的构造函数。 格式为: 派生类的构造函数名(参数表):基类的构造函数名(参数表) { //...... } 其中,基类构造函数参数,来源于派生类的构造函 数的参数表。 例4.8 #include <iostream.h> class base { int i; public: base(int n) //基类的构造函数 { cout << "执行 base 基类的构造函数\n"; i=n; } ~base( ) { cout <<"执行 base 基类的析构函数\n"; } void showi( ) { cout << i << endl; } }; class derive:public base { int j; public : dervie(int n, int m):base(m) //派生类的构造函数 { cout << "执行 dervie 派生类的构造函数\n"; j=n; } ~dervie( ) { cout <<"执行 dervie 派生类的析构函数\n"; } void showj( ) { cout << j << endl; } }; void main( ) { derive obj(30,40); obj.showi( ); obj.showj( ); } 18
当派生类中还含有对象成员时,其构造函数的格式为:19 派生类的构造函数名(参数表:基类的构造函数名(参数表),对象成员 1(参数表), 对象成员n(参数表){1……} 定义派生类对象时构造函数执行顺序 基类的构造函数对象成员构造函数派生类的构造函数; 例揽准派生类对时计n1构函数执行顺序正好相反 void maino class base i int x. i derive public: base(int i)//3 类的构造函数 obj (5); c0ut<"我行se基类的构造函数 n obj show 0; base{cout<"执行bae基类的析构函数m";} void show cout < <X<<end ass derive: public base i ba ase 心生类段函数可明0 dervied{cout<"行derv 的构函数m";}
当派生类中还含有对象成员时,其构造函数的格式为: 派生类的构造函数名(参数表):基类的构造函数名(参数表),对象成员 1(参数表),..., 对象成员n(参数表) { //...... } 定义派生类对象时构造函数执行顺序: 基类的构造函数 对象成员构造函数 派生类的构造函数; 当撤消派生类对象时,析构函数执行顺序正好相反。 例4.9#include <iostream.h> class base { int x; public: base(int i) //基类的构造函数 { cout << "执行 base 基类的构造函数\n"; x=i; } ~base() { cout <<"执行 base 基类的析构函数\n"; } void show() { cout << "x=" << x << endl; } }; class derive:public base { base d; public : dervie(int i):base(i),d(i) //派生类的构造函数 { cout << "执行 dervie 派生类的构造函数\n"; } ~dervie() { cout <<"执行 dervie 派生类的析构函数\n"; } }; void main() { derive obj(5); obj.show(); } 说明 P-105 19