构造函数调用顺序:
1》首先调用基类的构造函数(如果有基类);如果有多个基类,则按基类被列出的顺序调用;
2》调用这个类的成员对象的构造函数(如果有的话);弱国有多个成员对象,则按成员对象定义的顺序被调用(与参数列表中咧出的顺序无关);
3》最后调用这个类自身的构造函数;
注意:弱国有虚基类,则先调用虚基类的构造函数。在调用基类的构造函数,如果有多个虚基类,则按列出的顺序调用;
析构函数与此相反
简单的派生类的构造函数
#include<iostream>
#include<string>
usingnamespacestd;
classStudent//声明基类
{
protected:
intnum;
stringname;
charsex;
public:
Student(intn,stringnam,chars)//定义基类(含参)构造函数
{
num=n;
name=nam;
sex=s;
}
};
classStudent1:publicStudent//声明公用派生类Student1
{
private:
intage;
stringaddr;
public:
Student1(intn,stringnam,chars,inta,stringad):Student(n,nam,s)
//定义派生类构造函数
{
age=a;
addr=ad;
}
voidshow()
{
cout<<"num:"<
cout<<"name:"<
cout<<"sex:"<
cout<<"age:"<
cout<<"address"<
}
~Student1 (){}
};
派生类构造函数首行的写法
Student1(intn,stringnam,chars,inta,stringad):Student(n,nam,s)
派生类构造函数一般形式为
派生类构造函数名(总参数表):基类构造函数名(参数表)
{派生类中新增数据成员初始化语句}
冒号“:”前面部分是派生类构造函数的主干,他和以前介绍过的构造函数的形式相同,但它的总参数表中包括基类构造函数所需的参数和对派生类新增的数据成员初始化所需的参数。冒号“:”后面部分是要调用的基类构造函数及其参数。
从上面列出的派生类Student1构造函数首行中可以看到,派生类构造函数名(Student1)后面括号内的参数表中包括参数的类型和参数名(如int n) ,而基类构造函数名后面括号内的参数表列只有参数名而不包括参数类型(如n,num,s),因为在这里不是定义基类构造函数,而是调用基类构造函数,因此这些参数是实参而不是形参。它们可以是常量、全局变量和派生类构造参数总参数表中的参数。
从上面列出的派生类Student1构造函数中可以看到:调用基类构造函数Student时给出3个参数(n,nam,s),这是和定义基类构造函数时指定的参数相匹配的。派生类构造函数Student1有5个参数,其中前3个是用来传递给基类构造函数,后面两个(a和ad)是用来对派生类所增加的数据成员初始化的。
2派生类的析构函数
析构函数的作用是在对象撤销之前,进行必要的清理工作。
在派生时,派生类是不能继承基类的析构函数的,也需要通过派生类的析构函数去调用基类的析构函数。在派生类中可以根据需要定义自己的析构函数,用来地派生类中所增加的成员进行清理工作。基类的清理工作任然由基类的析构函数负责。
调用的顺序与构造函数正好相反:先执行派生类自己的析构函数,对派生类新增加的成员进行清理,然后调用子对象的析构函数,对子对象进行清理,最后调用基类的析构函数,对基类进行清理。
答案是B
首先子类对象的构造必然会先构造基类的对象,所以基类的构造函数和子类的构造函数都会调用,所以count++了两次,所以先输出2
然后show是虚函数,通过基类指针调用会调用子类的方法,所以调用的是D中的show方法,所以输出的是y,也就是120。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)