派生类有基类的成员,当构造派生类时,先执行的是基类的构造,然后根据顺序去执行基类成员的构造(在声c++中,调用基类构造,引用,const成员,都是用成员初始化表,在这个过程中,应该按照声明的顺序依次执行,在Java中可以直接调用super函数)
下面这个例子是我的老师期末复习题中的一道题目,我觉的十分有价值,就写进了自己的博客。
//1. class.h
#include <iostream.h>
class Person
{
int &ra;
const int yb;
public:
Person( int );
~Person();
};
class Stu:public Person
{
int zc;
Person objPn;
public:
Stu( int );
~Stu();
};
//2. Person.cpp
#include “class.h”
Person::Person( int n) //4 int n = 2
//10 第二次进入基类构造,int n = 4
//
:ra(*new int(++n))//5 ra = 3,此时n = 3 //11 第二次ra,ra = 5,此时n = 5
,yb(++n) //6 yb = 4,此时n = 4
//12 第二次yb,yb = 6,此时n = 6
{
cout<<”Person(int) : ra = ”
<<ra<<”, yb = ”
<<yb<endl;
//7 此时执行基类构造体,分别是3,4
//13 再次输出构造体,分别是5,6
}
Person::~Person() //18 objPn.,执行下面~函数体
//20 再次进入析构函数,销毁内置的基类对
//象,执行下面的函数体
{
delete &ra; //19 ,
cout<<”~Person()”<<endl; }
Stu::Stu( int s) //2 int s = 1
:objPn(++s),//9 再次调用基类构造s = 4
Person(++s) //3,此时s = 2
,zc(++s) //8 基类构造返回,zc =3此时s = 3
{
cout<<”Stu(int): zc = ”
<<zc
<<” obPn construction”
<<endl;
//14 执行派生类构造体,zc是3
}
Stu::~Stu() //16执行sobj.~,执行下面的函数体
{ cout<<”~Stu()”<<endl;
//17 调用调用对象成员objPn.~
//19 尾部自动跳转调用基类析构Person::~
}
//3. main.cpp
#include “class.h”
void main()
{ Stu sobj(1); //1
}//15 销毁so