42派生类的构造函数和析构函数 当一个派生类有构造函数时,则它必须对自己的数据成员和 继承而来的基类数据成员初始化,这和前面(第三章)讲的类定义 中有对象作为数据成员类似。因此需要由派生类的构造函数调用 基类的构造函数来完成
4.2 派生类的构造函数和析构函数 当一个派生类有构造函数时,则它必须对自己的数据成员和 继承而来的基类数据成员初始化,这和前面(第三章)讲的类定义 中有对象作为数据成员类似。因此需要由派生类的构造函数调用 基类的构造函数来完成。 16
421派生类的构造函数和析构函数执行顺序 当创建派生类对象时,首先执行基类的构造函数,随后再执行 派生类的构造函数;当撤消派生类对象时,则先执行派生类的析 构函数,随后再执行基类的析构函数。 例47 void main() #include <iostream.h> i dervie op class base i public: base(){cout<<"执行base类的构造函数n";} base(){cut<"执行base类的析构函数n";} class derive: public base i public: derie(:bae(){cou<"执行 derie类的构造函数m";} servier({cout<<"执行 derie类的析构函数m";}
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
录装类獒构盾款数含罗毅 函教的定义规 18 必须定义派生类的构造图数 格式为: 派生类的构造函数名(参数表基类的构造函数名(参数表) 1…}其中,基类构造函数参数,来源于派生类的构造函 数的参数表。 D4.8#include <iostream. h> void maino class base i i derive public b(30,4 bas m以镄誊图奚构造函数n"0s0) ng obj. showjo; base){cout<"行base基类的析构函 void showi(f cout <<end lass derive: public base i pu derie(int n cout < $:8 c0ut<"执行derv,派生类的析构函数n c0ut公j<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 定义派生类对象时构造函数执行顺序 基类的构造函数对象成员构造函数派生类的构造函数; 例 撤消派生类对象时,析构函数执行顺序正好相反。 nclude <iostream.h> class base i void maino Int x i derive public bant)/差的构造酌数 obj(5); cou ase 构造函数n"; obj. showO basel{cout<"执行,bae基类的析构函数u";} void show cout <<"x class derive: public base ase ublic dervied(inti):base(,d(i)/派生类的构造函数、说明P-105 dervied0{cout<"e派 cout 执 derie 的新函数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