1、继承的概念
继承就是在已存在的类的基础上建立一个新的类,已存在的类称为“基类”或“父类”,新建的类成为“派生类”或“子类”。继承机制是面向对象程序设计可以重复的最重要的手段,它允许在保持原有类特性的基础上进行扩展,增加功能,呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。
例如:声明了一个学生基本数据的类Student
class Student
{
public:
void Set()
{
cin >> name >> sex >> num;
}
void Display()
{
cout << "name:" << name << endl;
cout << "sex:" << sex << endl;
cout << "num:" << num << endl;
}
private:
char name[10];//姓名
char sex;//性别
char num[10];//学号
};
如果学校的某一部门除了需要用到姓名,性别,学号以外,还需要用到年龄,地址等信息,则可以不用再重新声明一个新的类,而是在Student类的基础上创建一个派生类。
2、派生类的声明方式
声明派生类的一般形式为:
class 派生类名 : [继承方式] 基类名
{
派生类新增加的成员
};
举例如下:在Student类的基础上创建一个派生类Student1
class Student1 :public Student
{
public:
void Set1()
{
cin >> age >> add ;
}
void Display1()
{
cout << "age:" << age << endl;
cout << "add:" << add << endl;
}
private:
int age;
char add[20];
};
继承方式包括:public(公有的),private(私有的),protected(受保护的),继承方式是可选的,如果不写,则默认继承方式是私有的。
3、派生类的构成
(1)、从基类接受的成员:派生类将基类所有的成员(不包括构造函数和析构函数)全部接收过来
缺点:有些积累中的数据成员在派生类中是用不到的,这样就会造成数据冗余,降低代码的效率。
(2)、调整从基类接收的成员:
法一:可以通过选择相应的继承方式改变基类的数据成员在派生类中的访问属性
法二:在派生类中声明一个与基类成员同名的成员,则派生类中的新成员会覆盖基类中与之同名的成员。应当注意的是,如果想覆盖基类中的成员函数,则在派生类中新创建的函数应与之完全相同(函数名和参数列表及返回值都应该相同)
(3)、在派生类中增加新的成员
4、三种继承方式的区别
(1)公用继承
基类的公有成员和保护成员在派生类中保持原有的属性,私有成员为基类所私有,在派生类中不可访问。
(2)保护继承
基类的公有成员和保护成员在派生类中成了保护成员,私有成员为基类所私有,在派生类中不可访问。
(3)私有继承
基类中的公有成员和保护成员在派生类中成了私有成员,私有成员为基类所私有,在派生类中不可访问。
5、派生类中的构造函数和析构函数
设计派生类的构造函数时,不仅要考虑派生类中新增成员的初始化,还要考虑基类成员的初始化,解决的方法为:在执行派生类的构造函数时,调用基类的构造函数。
我们来看下面的例子:
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
Student(string _name, char _sex, int _num)//基类的构造函数
:name(_name)
, sex(_sex)
, num(_num)
{}
~Student()//基类的析构函数
{
cout << "~Student()" << endl;
}
protected:
string name;//姓名
char sex;//性别
int num;//学号
};
class Student1 :public Student
{
public:
Student1(string _name, char _sex, int _num, int _age, string _add)//派生类构造函数
:Student(_name, _sex, _num)//调用基类构造函数
, age(_age)
, add(_add)
{}
void Display1()
{
cout << "name:" << name << endl;
cout << "sex:" << sex << endl;
cout << "num:" << num << endl;
cout << "age:" << age << endl;
cout << "add:" << add << endl;
}
~Student1()//派生类析构函数
{
cout << "~Student1()" << endl;
}
private:
int age;
string add;
};
int main()
{
Student1 s1("Jack", 'M', 01, 19, "weinan");
s1.Display1();
return 0;
}