任务描述
本关任务:采用多继承设计一个狼人类。
相关知识
在前面的关卡中,我们学习的派生类都只有一个基类,称为单继承。除此之外,C++ 也是支持多继承的,即一个派生类可以有两个或多个基类。下面我们就一起来学习多继承的使用。
多继承
C++ 语言支持一个子类同时继承多个父类,就像单继承时一样,继承多个父类也就相当于同时有了多个父类的公有成员和保护成员,而且可以单独为每一个父类指定继承的方式。
因此多继承的优点说可以使一个类实现多个接口,而缺点使容易造成混淆。
如果要继承多个类,只需将父类的类名依次写在子类类名的冒号(:
)后面,基类名之间用逗号(,
)隔开,每一个基类名前面带上它的访问性关键字。即多继承声明语法如下:
class 派生类名 : 访问控制 基类名1, 访问控制 基类名2, ...
{
成员变量和成员函数的声明
};
例如:
/* 继承关系:BaseA->D,BaseB->D */
class BaseA
{
public:
int A;
};
class BaseB
{
public:
int B;
};
class D : public BaseA , public BaseB // 公有继承 BaseA 和 BaseB
{
/* 其他成员 */
};
int main()
{
D d;
d.A = 10; // 给来自 BaseA 类的成员 A 赋值
d.B = 10; // 给来自 BaseB 类的成员 B 赋值
}
多继承访问基类成员
多继承访问基类成员大体与单继承一致,但当继承的多个父类中有同名的成员时,要访问其中一个成员就不能简单的只写成员名了,必须使用作用域运算符(::
)来指定是哪一个类的成员。
例如:
/* 继承关系:BaseA->D,BaseB->D */
class BaseA
{
public:
int A;
};
class BaseB
{
public:
int A; // 与 BaseA 的 A 成员同名了
};
class D : public BaseA , public BaseB / /公有继承 BaseA 和 BaseB
{
/* 其他成员 */
};
int main()
{
D d;
d.BaseA::A = 10; // 使用作用域运算符,给来自 BaseA 类的成员 A 赋值
d.BaseB::A = 10; // 使用作用域运算符,给来自 BaseB 类的成员 A 赋值
}
编程要求
在右侧编辑器中的Begin-End
之间补充代码,实现三个类的设计,其中成员变量和成员函数的访问性可自行设置,具体要求如下:
-
狼类( Wolf )
-
成员变量姓名:
string Name
-
成员变量爪子锋利度:
int Shape
-
成员函数:
void PrintState()
,按照姓名 爪子锋利度
格式输出两个成员变量的值。
-
-
人类( Human )
-
成员变量姓名:
string Name
-
成员变量智力:
int Intell
-
成员函数:
void PrintState()
,按照姓名 智力
格式输出两个成员变量的值。
-
-
狼人类( Werewolf ),它继承狼类和人类
-
成员函数:
void SetName(string name)
,函数用来设置两个基类的成员变量姓名。 -
成员函数:
void SetState(int shape,int intell)
,函数用 shape 、intell 两个参数分别设置狼类的爪子锋利度和人类的智力。 -
成员函数:
void PrintAllState()
,函数按照狼类,人类的顺序调用两个基类的 PrintState 函数,输出他们的成员变量值。
-
测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:
测试输入:10 0 狠人
预期输出:
姓名:狠人,爪子锋利度为:10
姓名:狠人,智力为:0
#include <string> #include <iostream> using namespace std; /********* Begin *********/ 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: //Werewolf(); 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 *********/