C++多层派生时的构造函数顺序问题

在派生类对象的创建过程中,首先是虚基类的构造函数被调用,并按照他们声明的顺序来构造,第二批是非虚基类的构造函数按他们的声明顺序调用,第三批是成员对象的构造函数调用,最后是派生自己的构造函数被调用。

一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构。在上面叙述的基础上,不难写出在多级派生情况下派生类的构造函数。


通过例下面的程序,读者可以了解在多级派生情况下怎样定义派生类的构造函数。相信大家完全可以自己看懂这个程序。

[例11.7] 多级派生情况下派生类的构造函数。 

#include <iostream>
#include<string>
using namespace std;
class Student//声明基类
{
public://公用部分
   Student(int n, string nam)//基类构造函数
   {
      num=n;
      name=nam;
   }
   void display( )//输出基类数据成员
   {
      cout<<"num:"<<num<<endl;
      cout<<"name:"<<name<<endl;
   }
protected://保护部分
   int num;//基类有两个数据成员
   string name;
};
class Student1: public Student//声明公用派生类Student1
{
public:
   Student1(int n,char nam[10],int a):Student(n,nam)//派生类构造函数
   {age=a;}//在此处只对派生类新增的数据成员初始化
   void show( ) //输出num,name和age
   {
      display( ); //输出num和name
      cout<<"age: "<<age<<endl;
   }
private://派生类的私有数据
   int age; //增加一个数据成员
};
class Student2:public Student1 //声明间接公用派生类Student2
{
public://下面是间接派生类构造函数
   Student2(int n, string nam,int a,int s):Student1(n,nam,a) {score=s;}
   void show_all( ) //输出全部数据成员
   {
      show( ); //输出num和name
      cout<<"score:"<<score<<endl; //输出age
   }
private:
   int score; //增加一个数据成员
};
int main( )
{
   Student2 stud(10010,"Li",17,89);
   stud.show_all( ); //输出学生的全部数据
   return 0;
}

运行时的输出如下:
num:10010
name:Li
age:17
score:89

请注意基类和两个派生类的构造函数的写法。

基类的构造函数首部:
    Student(int n, string nam)
派生类Student1的构造函数首部:
    Student1(int n, string nam],int a):Student(n,nam)
派生类Student2的构造函数首部:
    Student2(int n, string nam,int a,int s):Student1(n,nam,a)
注意不要写成:
    Student2(int n, string nam,int a,int s):Student1(n,nam),student1(n, nam, a)

不要列出每一层派生类的构造函数,只需写出其上一层派生类(即它的直接基类)的构造函数即可。在声明Student2类对象时,调用Student2构造函数;在执行Student2构造函数时,先调用Student1构造函数;在执行Student1构造函数时,先调用基类Student构造函数。初始化的顺序是:

  • 先初始化基类的数据成员num和name。
  • 再初始化Student1的数据成员age。
  • 最后再初始化Student2的数据成员score。 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值