第五周 继承
1.继承和派生的基本概念
2.继承关系和复合关系
3.覆盖和保护成员
4.派生类的构造函数
5.公有(public)继承的赋值兼容原则
1.继承和派生的基本概念
继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个 基类,而把B作为基类的一个 派生类( 也称子类) 。
派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。
派生类一经定义后,可以独立使用,不依赖于基类。
派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public 。
派生类的各个成员函数中,不能访问基类中的private成员。
一个派生类对象也是基类对象。
需要继承机制的例子
所有的学生都有的共同属性:
姓名,学号,性别,成绩
所有的学生都有的共同方法(成员函数):
是否该留级,是否该奖励
而不同的学生,又有各自不同的属性和方法
研究生:导师,系
大学生:系
中学生:竞赛特长加分
如果为每类学生都从头编写一个类,显然会有不少重复的代码,浪费。
派生类的写法
class 派生类名:public 基类名
{
};
class CStudent {
private:
string sName;
int nAge;
public:
bool IsThreeGood() { };
void SetName( const string & name )
{ sName = name; }
//......
};
class CUndergraduateStudent: public CStudent {
private:
int nDepartment;
public:
bool IsThreeGood() { ...... }; //覆盖,对基类进行修改
bool CanBaoYan() { .... };
}; // 派生类的写法是:类名: public 基类名
class CGraduatedStudent:public CStudent {
private:
int nDepartment;
char szMentorName[20];
public:
int CountSalary() { ... };
};
派生类对象的内存空间
派生类对象的体积,等于基类对象的体积,再加上派
生类对象自己的成员变量的体积。在派生类对象中,包
含着基类对象,而且基类对象的存储位置位于派生类对
象新增的成员变量之前。
class CBase
{
int v1,v2;
};
class CDerived:public CBase
{
int v3;
};
例子,继承实例程序:学籍管理
#include <iostream>
#include <string>
using namespace std;
class CStudent {
private:
string name;
string id; //学号
char gender; //性别,'F'代表女,'M'代表男
int age;
public:
void PrintInfo();
void SetInfo( const string & name_,const string & id_,int age_, char gender_ );
string GetName() { return name; }
};
class CUndergraduateStudent:public CStudent
{
//本科生类,继承了CStudent类
private:
string department; //学生所属的系的名称
public:
void QualifiedForBaoyan() { //给予保研资格
cout << “qualified for baoyan” << endl;
}
void PrintInfo() {//覆盖了基类的PrintInfo()
CStudent::PrintInfo(); //调用基类的PrintInfo
cout << “Department:” << department <<endl;
}
void SetInfo( const string & name_,const string & id_,int age_,char gender_ ,const string & department_) {
CStudent::SetInfo(name_,id_,age_,gender_); //调用基类的SetInfo
department = department_;
}
};
void CStudent::PrintInfo()
{
cout << "Name:" << name << endl;
cout << "ID:" << id << endl;
cout << "Age:" << age << endl;
cout << "Gender:" << gender << endl;
}
void CStudent::SetInfo( const string & name_,const string & id_,int age_,char gender_ )
{
name = name_;
id = id_;
age = age_;
gender = gender_;
}
void CStudent::PrintInfo()
{
cout << "Name:" << name << endl;
cout << "ID:" << id << endl;
cout << "Age:" << age << endl;
cout << "Gender:" << gender << endl;
}
void CStudent::SetInfo( const string & name_,const string & id_,int age_,char gender_ )
{
name = name_;
id = id_;
age = age_;
gender = gender_;
}
int main()
{
CUndergraduateStudent s2;
s2.SetInfo(“Harry Potter ”, “118829212”,19,‘M’,“Computer Science”);
cout << s2.GetName() << “ ” ;
s2.QualifiedForBaoyan ();
s2.PrintInfo ();
return 0;
}
输出结果:
Harry Potter qualified for baoyan
Name:Harry Potter
ID:118829212
Age:19
Gender:M
Department:Computer Science