void f3(); int k; };
class C:protected B{ int n; public:
void f4(); protected: int m; };
class D:private C{ int q; public:
void f5(); protected: int p; }; 成员 i 类 基类A 私有√ B公有继承 C保护继承 D私有继承 × f1 f2 B::m f3 k n f4 C::m q f5 p 公有√ 公有√ 保护√ 私有√ 保护√ 保护√ 保护√ 私有√ 私有√ × 公共√ 保护√ 私有√ 公共√ 保护√ 私有√ × 私有公共√ √ × 私有√ 保护√ 私有√ × × 私有公共√ √ 保护√
5.5 派生类的构造函数和析构函数
在第3章中讲过,用户如果没有定义构造函数,C++会自动提供给我们一个默认的构造函数。在定义类对象时会自动调用默认的构造函数。
基类的构造函数是不能继承的,所以在声明派生类时,不仅要考虑派生类所增加的数据成员的初始化,还要考虑基类的数据成员的初始化。 5.5.1 简单的派生类中的构造函数
简单的派生只有一个基类,而且只有一级派生,在派生类的数据成员中不包含子对象(子对象问题在下面马上讲解)。
先来看一个最简单的实例。
//自编,是简单的继承。隐含调用默认构造函数 #include
public: A(){cout<<\};
class B:public A {
public: //B(){cout<<\};
int main() { B b; }
运行结果: A
看到这个结果不要认为是派生类B继承了基类A的构造函数,其实只是隐含调用了基类的默认构造函数。思考:如果把注释删除,运行结果会是什么?
B(){cout<<”B”< 如果基类的构造函数是有参的,那么你在派生类中不定义构造函数程序就会出错。下面我们就来看一下书中的实例。 //例5.5 简单的派生类的构造函数。 #include class Student //声明基类Student { public: Student(int n,string nam,char s) //基类构造函数 {num=n; name=nam; sex=s; } ~Student( ){ } //基类析构函数 protected: //保护部分 int num; string name; char sex ; }; class Student1: public Student //声明派生类Student1 { public: //派生类的公用部分 Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s) { age=a; //在函数体中只对派生类新增的数据成员初始化 addr=ad; } //也可写成如下形式: //Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s),age(a),addr(ad){} void show( ) { cout<<\ cout<<\ cout<<\ cout<<\ cout<<\ } ~Student1( ){ } //派生类析构函数 private: //派生类的私有部分 int age; string addr; }; int main( ) {Student1 stud1(10010,\ Student1 stud2(10011,\ stud1.show( ); //输出第一个学生的数据 stud2.show( ); //输出第二个学生的数据 return 0; } 运行结果: num:10010 name:Wang-li sex:f age:19 address:115 Beijing Road,Shanghai num:10011 name:Zhang-fun sex:m age:21 address:213 Shanghai Road,Beijing 派生类构造函数的一般形式为: 派生类构造函数名(总参数表列):基类构造函数名(参数表列) {派生类中新增数据成员初始化语句} 总参数表列中包括基类构造函数所需的参数和对派生类中新增的数据成员初始化所需的参数。 在建立一个对象时,执行构造函数的顺序是:派生类构造函数先调用基类构造函数再执行派生类构造函数本身。 在派生类对象释放时,先执行派生类构构函数再执行基类析构函数。 思考:将上例基类构造函数中加入语句:cout<<”student”< address:115 Beijing Road,Shanghai num:10011 name:Zhang-fun sex:m age:21 address:213 Shanghai Road,Beijing ~Student1 ~Student ~Student1 ~Student 5.5.2有子对象的派生类的构造函数 在前面介绍的类中数据成员都是标准数据类型,而实际上也可以是类对象。这种称为子对象。 //自编,有一个子对象 #include //------------------------------------- class A { public: A(int x){ cout<<\};//----------------------------------- class C { A a; //有一个子对象 public: C(int i1,int i2):a(i1){ cout<<\ //构造函数,要构造子对象 };//----------------------------------- int main() { C c(15,2); return 0; }//==================================== 运行结果如下:A:15->C:2,从结果可以看出,先执行子对象的构造函数。 思考:如果有一个派生类继承了类C(这个类有子对象),那么这个构造函数该要怎么定义呢?这个问题后面马上就有讲解。答案先写在下面。 class P:public C { public: P(int i1,int i2,int i3):C(i1,i2){cout<<\}; 下面再来看有多个子对象时的情况,书中没有介绍,但我们一定要了解。 // 自编,有二个子对象 #include //------------------------------------- class A{ public: A(int x){ cout<<\};//----------------------------------- class B{ public: B(int x){ cout<<\};//----------------------------------- class C{ //类C中的两个子对象 先声明a,再声明b A a; B b; public: C(int x,int y):b(x),a(y){ cout<<\ //构造参数表的顺序是先b后a //如果构造顺序是先a后 b,其结果是一样的,与声明时的顺序有关。 };//----------------------------------- int main(){ C c(15, 9); }//==================================== 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章 继承与派生(3)在线全文阅读。
相关推荐: