第1关:公有继承 —— 学生信息类
任务描述
本关任务:采用公有继承设计学生信息类。
相关知识
继承
继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。简单的说,继承是指一个对象直接使用另一对象的属性和方法。
C++ 中的继承关系就好比现实生活中的父子关系,继承一笔财产比白手起家要容易得多,原始类称为基类,继承类称为派生类,基类是对派生类的抽象,派生类是对基类的具体化。它们是类似于父亲和儿子的关系,所以也分别叫父类和子类。而子类又可以当成父类,被另外的类继承。
继承方式
不同的继承方式决定了基类成员在派生类中的访问属性,主要体现在:
-
派生类成员对基类成员的访问权限;
-
通过派生类对象对基类成员的访问权限。
对于派生类的成员或者派生类对象访问自己类的成员不讨论,跟一般类一样,下面只讨论对基类的成员的访问。
-
公有继承:基类的 public 和 protected 成员访问属性在派生类中保持不变;基类的 private 成员不可直接访问。
-
保护继承:基类的 public 和 protected 成员都以 protected 身份出现在派生类中;基类的 private 成员不可直接访问。
-
私有继承:基类的 public 和 protected 成员,都以 private 身份出现在派生类中;基类的 private 成员不可直接访问。
可以看出无论采用何种继承方式得到的派生类,派生类成员及其友元都不能访问基类的私有成员。且一般情况,保护继承与私有继承在实际编程中极少使用,它们只在技术理论上有意义。
#include "people.h" // People 类定义在这里面
#include <string>
#include <iostream>
using namespace std;
class Student:public People
{
public:
int SID;
void PrintSID();
};
void Student::PrintSID()
{
cout << "学号:" << SID << endl;
}
void Set(int sid,string name,Student *ptr)
{
ptr->SID=sid;
ptr->Name=name;
}
第2关:保护继承 —— 学生信息类
任务描述
本关任务:采用保护继承设计学生信息类。
相关知识
为了完成本关任务,你需要掌握保护继承的使用。
保护继承
保护继承相对于公有继承,访问性有所降低,父类的公有成员在子类中变成了保护成员,也就无法在外部通过一个对象访问父类成员了,但是对于这个子类的子类仍然是可见的(因为可见性只是降到了 protected )。
如果要保护继承一个类,只需继承时在类名前面加上 protected 关键字即可。
#include "people.h" // People 类定义在这里面
#include <string>
#include <iostream>
using namespace std;
class Student : protected People
{
public:
int SID;
void PrintSID();
friend void Set(int sid,string name,Student *ptr);
};
void Student::PrintSID()
{
cout << "学号:" << SID << endl;
}
void Set(int sid,string name,Student *ptr)
{
ptr->SID=sid;
ptr->Name=name;
}
第3关:研究生信息类
任务描述
本关任务:采用私有继承完成学生信息类和研究生信息类的设计。
相关知识
为了完成本关任务,你需要掌握私有继承的使用。
私有继承
私有继承在保护继承的基础上更进一步,访问性进一步降低,父类中的公有成员和保护成员的访问性均降到了私有 private,不仅对外不可见,对这个类的子类也不可见了。
要私有继承一个类,只需继承时在类名前面加上 private 关键字即可。
#include "people.h" //People类定义在这里面
#include <string>
#include <iostream>
using namespace std;
class Student:private People
{
public:
int SID;
void PrintSID();
void SetName(string name){Name=name;};
};
void Student::PrintSID()
{
cout << "学号:" << SID << endl;
}
class Graduate:public Student
{
public:
int ResearchID;
void PrintResearchID();
friend void Set(string name,int sid,int rid,Graduate *ptr);
void set(string name){SetName(name);};
};
void Graduate::PrintResearchID()
{
cout<<"研究方向:"<<ResearchID<<endl;
}
void Set(string name,int sid,int rid,Graduate *ptr)
{
ptr->set(name);
ptr->SID=sid;
ptr->ResearchID=rid;
}
第4关:狼人类
任务描述
本关任务:采用多继承设计一个狼人类。
相关知识
在前面的关卡中,我们学习的派生类都只有一个基类,称为单继承。除此之外,C++ 也是支持多继承的,即一个派生类可以有两个或多个基类。下面我们就一起来学习多继承的使用。
多继承
C++ 语言支持一个子类同时继承多个父类,就像单继承时一样,继承多个父类也就相当于同时有了多个父类的公有成员和保护成员,而且可以单独为每一个父类指定继承的方式。
因此多继承的优点说可以使一个类实现多个接口,而缺点使容易造成混淆。
如果要继承多个类,只需将父类的类名依次写在子类类名的冒号(:
)后面,基类名之间用逗号(,
)隔开,每一个基类名前面带上它的访问性关键字。即多继承声明语法如下:
#include <string>
#include <iostream>
using namespace std;
class Wolf
{
public:
string Name;
int Shape;
void PrintState();
};
void Wolf::PrintState()
{
cout<< "姓名:"<<Name<<",爪子锋利度为:"<<Shape<<endl;
}
class Human
{
public:
string Name;
int Intell;
void PrintState();
};
void Human::PrintState()
{
cout<< "姓名:"<<Name<<",智力为:"<<Intell<<endl;
}
class Werewolf:public Wolf,public Human
{
public:
void SetName(string name);
void SetState(int shape,int intell);
void PrintAllState();
};
void Werewolf::SetName(string name)
{
Wolf::Name=name;
Human::Name=name;
}
void Werewolf::SetState(int shape,int intell)
{
Shape=shape;
Intell=intell;
}
void Werewolf::PrintAllState()
{
Wolf::PrintState();
Human::PrintState();
}
/********* End *********/