- 所谓继承就是从先辈处得到属性和行为特征。专业的说就是在已有类的基础上创建新的类,新类可以从一个或多个已有类中继承成员函数和数据成员,而且重新定义或加进新的数据和函数,从而引成类的层次或等级。其中,已有类称为基类或父类,在他基础上建立的类称为派生类或子类。
上图是简单的学生分类图
下面通过一个例子说明为什么要使用继承。
现在有一个学生类 Student, 它含有 number, name, score 等数据成员与成员函数 print( ), 代码如下:
class Student
{
public:
void print()
{
cout<<"number:"<<number<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
}
protected:
int number;
string name;
float score;
};
假设现在要申明一个大学生类 UStudent,它含有 number, name, score, major 等数据和成员函数 print1(),代码如下:
class UStudent
{
public:
void print1()
{
cout<<"number:"<<number<<endl;//此行在Student类中已存在
cout<<"name:"<<name<<endl;//此行在Student类中已存在
cout<<"score:"<<score<<endl;//此行在Student类中已存在
cout<<"major:"<<major<<endl;//此行在Student类中 不 存在
}
protected:
int number;//此行在Student类中已存在
string name;//此行在Student类中已存在
float score;//此行在Student类中已存在
string major;//此行在Student类中 不 存在
};
我们发现Student类和UsStudent类中有有许多相同的地方,像这样两个类,代码严重重复, 为提高代码的可重用性,可以引入继承,将UStudent类说明成Student类的派生类,那些相同的成员就不必在UsStudent类中说明了。代码如下:
class Student
{
public:
void print()
{
cout<<"number:"<<number<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
}
protected:
int number;
string name;
float score;
};
class UStudent:public Student
{
public:
void print1()//新的成员函数
{
print();
cout<<"major:"<<major<<endl;
}
protected:
string major;//新增加的数据成员
};
2.基类成员在派生类中的访问属性:
3. 1派生类的构造函数和析构函数
3.1.1派生类构造函数和析构函数的调用规则
通常情况下,当创建派生类对象时,首先调用积累的构造函数,随后再调用派生类的构造函数,当撤销派生类对象时,则先调用派生类的析构函数,随后再调用基类的构造函数。
3.2派生类构造函数和析构函数的构造规则
3.2.1简单的派生类的构造函数和析构函数
当基类的构造函数没有参数,或没有显示定义构造函数时,派生类可以不向基类传递,甚至可以不定义构造函数。派生类不能继承基类中的构造函数和析构函数。当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。代码解析:
#include<iostream>
#include<stdlib.h>
using namespace std;
class B //申明基类B
{
public:
B(int n) //基类的构造函数
{
cout<<"Constructing B class"<<endl;
i = n;
}
~B() //基类的析构函数
{
cout<<"Destructing B class"<<endl;
}
void dispi()
{
cout<<i<<endl;
}
private:
int i;
};
class D:public B //申明基类B的公有派生类D
{
public:
D(int n, int m) //定义派生类构造函数时,
:B(m) //缀上要调用的基类构造函数及其参数
{
cout<<"Constructing D class"<<endl;
j = n;
}
~D() //派生类的析构函数
{
cout<<"Destructing D class"<<endl;
}
void dispj()
{
cout<<j<<endl;
}
private:
int j;
};
void Funtest()
{
D obj(50,60);
obj.dispi();
obj.dispj();
}
int main()
{
Funtest();
system("pause");
return 0;
}
结果如下:
未写完