C++ 面向对象 - 类的继承与派生 狼人类

本文介绍了C++中多继承的概念,通过实例展示了如何创建一个派生类Werewolf,它同时继承自Wolf和Human类,以及如何访问和设置基类的成员变量和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务描述

本关任务:采用多继承设计一个狼人类。

相关知识

在前面的关卡中,我们学习的派生类都只有一个基类,称为单继承。除此之外,C++ 也是支持多继承的,即一个派生类可以有两个或多个基类。下面我们就一起来学习多继承的使用。

多继承

C++ 语言支持一个子类同时继承多个父类,就像单继承时一样,继承多个父类也就相当于同时有了多个父类的公有成员和保护成员,而且可以单独为每一个父类指定继承的方式。

因此多继承的优点说可以使一个类实现多个接口,而缺点使容易造成混淆。

如果要继承多个类,只需将父类的类名依次写在子类类名的冒号(:)后面,基类名之间用逗号(,)隔开,每一个基类名前面带上它的访问性关键字。即多继承声明语法如下:

 
  1. class 派生类名 : 访问控制 基类名1, 访问控制 基类名2, ...
  2. {
  3. 成员变量和成员函数的声明
  4. };

例如:

 
  1. /* 继承关系:BaseA->D,BaseB->D */
  2. class BaseA
  3. {
  4. public:
  5. int A;
  6. };
  7. class BaseB
  8. {
  9. public:
  10. int B;
  11. };
  12. class D : public BaseA , public BaseB // 公有继承 BaseA 和 BaseB
  13. {
  14. /* 其他成员 */
  15. };
  16. int main()
  17. {
  18. D d;
  19. d.A = 10; // 给来自 BaseA 类的成员 A 赋值
  20. d.B = 10; // 给来自 BaseB 类的成员 B 赋值
  21. }
多继承访问基类成员

多继承访问基类成员大体与单继承一致,但当继承的多个父类中有同名的成员时,要访问其中一个成员就不能简单的只写成员名了,必须使用作用域运算符(::)来指定是哪一个类的成员。

例如:

 
  1. /* 继承关系:BaseA->D,BaseB->D */
  2. class BaseA
  3. {
  4. public:
  5. int A;
  6. };
  7. class BaseB
  8. {
  9. public:
  10. int A; // 与 BaseA 的 A 成员同名了
  11. };
  12. class D : public BaseA , public BaseB / /公有继承 BaseA 和 BaseB
  13. {
  14. /* 其他成员 */
  15. };
  16. int main()
  17. {
  18. D d;
  19. d.BaseA::A = 10; // 使用作用域运算符,给来自 BaseA 类的成员 A 赋值
  20. d.BaseB::A = 10; // 使用作用域运算符,给来自 BaseB 类的成员 A 赋值
  21. }
编程要求

在右侧编辑器中的Begin-End之间补充代码,实现三个类的设计,其中成员变量和成员函数的访问性可自行设置,具体要求如下:

  1. 狼类( Wolf )

    • 成员变量姓名:string Name

    • 成员变量爪子锋利度:int Shape

    • 成员函数:void PrintState(),按照姓名 爪子锋利度格式输出两个成员变量的值。

  2. 人类( Human )

    • 成员变量姓名:string Name

    • 成员变量智力:int Intell

    • 成员函数:void PrintState(),按照姓名 智力格式输出两个成员变量的值。

  3. 狼人类( Werewolf ),它继承狼类和人类

    • 成员函数:void SetName(string name),函数用来设置两个基类的成员变量姓名。

    • 成员函数:void SetState(int shape,int intell),函数用 shape 、intell 两个参数分别设置狼类的爪子锋利度和人类的智力。

    • 成员函数:void PrintAllState(),函数按照狼类,人类的顺序调用两个基类的 PrintState 函数,输出他们的成员变量值。

测试说明

平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:10 0 狠人 预期输出:

 
  1. 姓名:狠人,爪子锋利度为:10
  2. 姓名:狠人,智力为: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 *********/
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值