【继承练习】

本文详细介绍了C++中的面向对象编程概念,包括如何创建基类Person,派生出Student、Employee、Faculty和Staff类,以及如何定义MyDate类。每个类都有各自的构造函数和print方法,用于输出相关信息。示例展示了如何实例化这些类并输出其成员变量的值。

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

①声明并实现一个名为Person的基类,Person类有保护数据成员name(姓名,string类型)、sex(性别,char类型,'M'表示男,'F'表示女)。以及有参构造函数,将姓名、性别设置为给定的参数;成员函数print,输出姓名和性别。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

②从Person类派生出Student类,Student类有私有数据成员status(状态,string类型),表示年级(FRESHMAN、SOPHOMORE、JUNIOR、SENIOR),表示大一、大二、大三、大四学生。以及有参构造函数,将姓名、性别、状态设置为给定的参数;成员函数print,print函数输出姓名、性别和状态。
③定义MyDate类,它包含私有数据成员year、month和day以及带默认参数的有参构造函数,年、月、日的默认参数值分别为1900、1、1;成员函数print,输出年、月、日。
④从Person类派生出Employee类,Employee类有保护数据成员salary(薪水,int类型)、dateHired(雇佣日期),dataHired的类型是MyDate。以及有参构造函数,将姓名、性别、薪水和雇佣日期设置为给定的参数;成员函数print,输出姓名、性别、薪水和雇佣日期。
⑤从Employee类派生出Faculty类,Faculty类有私有数据成员rank(级别,string类型),有(PROFESSOR、ASSOCIATE_PROFESSOR、LECTURER),表示教授、副教授、讲师。以及有参构造函数,将姓名、性别、薪水、雇佣日期和级别设置为给定的参数;成员函数print,输出姓名、性别、薪水、雇佣日期和级别。
⑥从Employee类派生出Staff类,Staff类有私有数据成员headship(职务,string类型),有(PRESIDENT、DEAN、DEPARTMENT_CHAIRMAN),表示校长、院长、系主任。以及有参构造函数,将姓名、性别、薪水、雇佣日期和职务设置为给定的参数;成员函数print,输出姓名、性别、薪水、雇佣日期和职务。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

 ‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

输入输出示例

逐个输入:‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

Person对象的构造信息‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

Student的构造信息‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

Data的构造信息‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

Employee的构造信息‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

Faculty的构造信息‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

Staff的构造信息‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

其中雇佣日期都使用相同的日期,所以构造一个对象即可‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬

输入输出
示例 1

ZhangSan

M

LiSi

F

FRESHMAN

2012

10

31

WangWu

M

5000

LiuLiu

M

10000

PROFESSOR

QianQi

M

8000

DEPARTMENT_CHAIRMAN

Name:ZhangSan,  Sex:M

Name:LiSi,  Sex:F

FRESHMAN

Name:WangWu,  Sex:M

Salary:5000,  Hire date:2012-10-31

Name:LiuLiu,  Sex:M

Salary:10000,  Hire date:2012-10-31

PROFESSOR

Name:QianQi,  Sex:M 

Salary:8000,  Hire date:2012-10-31

DEPARTMENT_CHAIRMAN

//注意:输出要一一对应,好好审题
#include<iostream>
#include<string>
using namespace std;
class Person {
protected:
    string name;
    char sex;
public:
    Person(string na, char se) {
        name = na;
        sex = se;
    }
    void print() {
        cout << "Name:" << name << ", Sex:" << sex << endl;//输出姓名和性别
    }
};
class Student :public Person {
    string status;
public:
    Student(string na, char se, string sta) :Person(na, se) {
        status = sta;
    }
    void print();
};
void Student::print() //输出姓名,性别和年级
{
    Person::print();
    cout << status << endl;
}
class MyDate {
    int year, month, day;
public:
    MyDate(int y = 1900, int m = 1, int d = 1) {
        year = y;
        month = m;
        day = d;
    }
    void print() {
        cout << ", Hire date:" << year << "-" << month << "-" << day<<endl;
    }
};
class Employee :public Person {
protected:
    int salary;
    MyDate dateHired;
public:
    Employee(string na1, char se1, int y1, int m1, int d1, int sa) :Person(na1, se1), dateHired(y1, m1, d1) {
        salary = sa;
    }
    void print()  //输出姓名,性别,薪水和雇佣日期
    {
        Person::print();
        cout << "Salary:" << salary; 
        dateHired.print() ;
    }
};
class Faculty :public Employee {
    string rank;
public:
    Faculty(string na2, char se2, int y2, int m2, int d2, int sa1, string ra) :Employee(na2, se2, y2, m2, d2, sa1) {
        rank = ra;
    }
    void print()//输出姓名,性别,薪水、雇佣日期和级别
    {
        Employee::print();
        cout << rank << endl;
    }
};
class Staff :public Employee {
    string headship;
public:
    Staff(string na3, char se3, int y3, int m3, int d3, int sa2, string he) :Employee(na3, se3, y3, m3, d3, sa2) {
        headship = he;
    }
    void print() //输出姓名、性别、薪水、雇佣日期和职务设置
    {
        Employee::print();
        cout << headship << endl;
    }
};
int main() {
    string na1, na2, na3, na4, na5, sta, ra, he;
    char se1, se2, se3, se4, se5;
    int y, m, d, sa1, sa2, sa3;
    cin >> na1 >> se1 >> na2 >> se2 >> sta >> y >> m >> d >> na3 >> se3 >> sa1 >> na4 >> se4 >> sa2 >> ra >> na5 >> se5 >> sa3 >> he;
    Person A(na1, se1);
    A.print();//输出姓名和性别
    Student B(na2, se2, sta);
    B.print();//输出姓名,性别和年级
    Employee C(na3, se3, y, m, d,sa1);
    C.print();//输出姓名,性别,薪水和雇佣日期
    Faculty D(na4, se4, y, m, d,sa2,ra);
    D.print();//输出姓名,性别,薪水、雇佣日期和级别
    Staff E(na5, se5, y, m, d,sa3,he);
    E.print();//输出姓名、性别、薪水、雇佣日期和职务设置
    return 0;
}

### Java 封装与继承练习题及教程 #### 了解封装的重要性 封装是面向对象编程中的一个重要概念,它允许将数据和方法绑定在一起,并隐藏对象内部状态。通过访问修饰符(`private`, `protected`, 和 `public`),开发者能够控制哪些部分对外部可见[^1]。 ```java class Person { private String name; public void setName(String newName){ this.name = newName; } } ``` 上述代码展示了如何利用私有字段来保护成员变量免受外部直接修改的影响,而提供公共的方法用于安全地设置这些属性值。 #### 探索单继承机制 Java 中只支持单一继承模式,即一个子类只能有一个父类。然而这并不意味着功能上的局限;相反,这种设计简化了程序结构并减少了复杂度。当创建新的类时可以通过扩展已有的基类获得其特性以及行为: ```java // 定义动物类作为超类 class Animal{ protected String sound; // 构造函数初始化声音属性 public Animal(){ this.sound="Some Sound"; } // 发声的行为定义 public void makeSound() { System.out.println(sound); } } // 创建狗类继承自Animal class Dog extends Animal{ @Override public void makeSound(){sound ="Woof!"; super.makeSound();} } Dog myDog=new Dog();myDog.makeSound();// 输出 Woof! ``` 这段例子说明了一个简单的继承关系——其中`Dog` 类是从更通用的 `Animal` 基础上构建出来的具体实例化版本。 #### 实现接口以模拟多继承效果 尽管 Java 不允许多重传统意义上的多重继承形式,但是借助于接口可以达到相似目的。接口是一种完全抽象的数据类型,里面只有常量声明和未实现的方法签名。任何实现了该接口的具体类都必须给出相应操作的实际编码逻辑。因此如果某个实体需要具备多种不同类型的特征,则可以让它同时实现多个不同的接口从而间接达成“多继承”的目标。 ```java interface Flyable { void fly(); } interface Swimmable { void swim(); } class Duck implements Flyable,Swimmable { @Override public void fly() {} @Override public void swim(){} } ``` 这里展示的是鸭子这个物种既会飞也会游泳的事实被映射到了相应的两个独立却又相互关联的功能集合之上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值