派生类得构成
派生类的成员包括从基类继承过来的成员和自己增加的成员两大部分。从基类继承的成员体现了派生类从基类继承而获得的共性,而新加的成员体现了派生类的个性。正是这些新增加的成员体现了派生类与基类的不同,也体现了不同派生类的区别 。
实际上,并不是把基类的成员和派生类自己增加的成员简单的加在一起就成为派生类。构造一个派生类包括以下三个部分:
(1)从基类接受成员。
派生类把基类全部的成员(不包括构造函数和析构函数)接受过来,也就是说没有选择的,不能选择接受一部分成员,舍弃一部分成员。
(2)调整从基类接受的成员。
接收基类成员是程序人员不能选择的,但是程序人员可以对这些成员做某些调整。例如可以改变基类成员在派生类中的访问属性,这是通过指定继承的方式来实现的。如可以通过继承把基类的公用成员指定为派生类中的访问属性为私有(即在派生类外无法访问)。此外,可以在派生类中声明一个与基类成员同名的成员,则派生中的新成员回覆盖基类的同名成员,但要注意:如果是成员函数,不仅应使函数名相同,而且函数的参数的个数和类型也相同,如果不相同,就成为函数的重载而不是覆盖,用这种方法可以用新成员取代基类成员。
(3)在声明派生类时增加的成员。
它体现了派生类对基类的扩展。
此外,在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数不能从基类继承。因此可以看出派生类是基类定义的延续,即派生类是基类的具体实现。
对于有子对象的派生类的构造函数
一个简单的例子:
<span style="font-size:14px;"><strong>#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
Student(int n, string m)
{
num=n;
name=m;
}
void display()
{
cout<<"num:"<<num<<endl<<"name:"<<name<<endl;
}
protected:
int num;
string name;
};
class Student1:public Student
{
public:
Student1(int n, string m,int x, string y,int a, string add ):Student(n, m),monitor(x, y)
{
age=a;
addr=add;
}
void show()
{
cout<<"the student is:"<<endl;
display();
cout<<"age:"<<age<<endl;
cout<<"addr:"<<addr<<endl;
}
void monitor_show()
{
cout<<endl<<"the class monitor is:"<<endl;
monitor.display();
}
private:
Student monitor;
int age;
string addr;
};
int main()
{
Student1 stud1(12313,"LiHua",10223,"SDf",19,"ASDFefsa ASDFas");
stud1.show();
stud1.monitor_show();
return 0;
}</strong></span>
运行结果: