Educator:C++ 面向对象 - 类的继承与派生

第1关:公有继承 —— 学生信息类


任务描述

本关任务:采用公有继承设计学生信息类。

相关知识
继承

继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。简单的说,继承是指一个对象直接使用另一对象的属性和方法。

C++ 中的继承关系就好比现实生活中的父子关系,继承一笔财产比白手起家要容易得多,原始类称为基类,继承类称为派生类,基类是对派生类的抽象,派生类是对基类的具体化。它们是类似于父亲和儿子的关系,所以也分别叫父类和子类。而子类又可以当成父类,被另外的类继承。

继承方式

不同的继承方式决定了基类成员在派生类中的访问属性,主要体现在:

  1. 派生类成员对基类成员的访问权限;

  2. 通过派生类对象对基类成员的访问权限。

对于派生类的成员或者派生类对象访问自己类的成员不讨论,跟一般类一样,下面只讨论对基类的成员的访问。

  • 公有继承:基类的 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 *********/

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值