C++ 继承和派生 及 学生管理范例

本文介绍了面向对象编程中的继承概念,包括派生类如何从基类继承特性并进行扩展,通过学生管理系统实例展示了不同类型的学生成员变量和成员函数的具体实现。

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

1、概念

继承:在定义一个新的类B时,如果该类与某个已知类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为一个派生类(也称子类)。

  • 派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。
  • 派生类一经定义后,可以独立使用,不依赖于基类。
  • 派生类拥有基类的全部成员函数和成员变量,不论是private,protected 还是 public
  • 在派生类的各个成员函数中,不能访问基类中的private成员。

2、需要继承机制的例子 - 学生管理系统

所有的学生都有的共同属性:

  • 姓名
  • 学号
  • 性别
  • 成绩

所有的学生都有的共同方法(成员函数)

  • 是否该留级
  • 是否该奖励

而不同的学生,又有各自不同的属性和方法

  • 研究生:有导师和系
  • 大学生:有系
  • 中学生:有竞赛特长加分

3、派生类的写法

class 派生类名 : public 基类名 
{

};

 

4、派生类对象的内存空间

派生类对象的体积,等于基类对象的体积,再加上派生类对象自己的成员变量的体积。

在派生类对象中,包含着基类对象,而且基类对象的存储位置位于派生类对象新增的成员

变量之前。如下代码示:

#include <iostream>
#include <string.h>

using namespace std;

class CBase {
    int v1, v2;
};

class CDerived : public CBase {
    int v3;
};

int main()
{
    printf("sizeof(CDerived) = %d\n", sizeof(CDerived));

    return 0;
}

输出的结果是:12

 

5、继承实例程序:学籍管理

#include <iostream>
#include <string.h>

using namespace std;

class CStudent {

private:
    string name;
    string id; // student number
    char gender; // 'F' for female, 'M' for male
    int age;

public:
    void PrintInfo() {
        cout << "name: " << name << endl;
        cout << "id: " << id << endl;
        cout << "gender: " << gender << endl;
        cout << "age: " << age << endl;
    }
    void SetInfo(const string & name_, const string & id_,
                 int age_, char gender_) {
        name = name_;
        id = id_;
        age = age_;
        gender = gender_;
    }
    string GetName() { return name; }
};

class CUndergraduateStudnet : public CStudent
{
private:
    string department; // 学生所属的系

public:
    void QualifiedForBaoyan() {
        cout << "qualified for baoyan" << endl;
    }

    void PrintInfo() {
        CStudent::PrintInfo(); // 调用基类的PrintInfo
        cout << "Department:" << department << endl;
    }

    void SetInfo(const string &name_, const string &id_,
                 int age_, char gender_, const string & department_) {
        CStudent::SetInfo(name_, id_, age_, gender_); // 调用基类的SetInfo
        department = department_;
    }
};

int main()
{
    CUndergraduateStudnet s2;
    s2.SetInfo("Harry Potter", "115200", 20, 'M', "CS");
    cout<< s2.GetName() << endl;
    s2.QualifiedForBaoyan();
    s2.PrintInfo();

    return 0;
}

执行结果如下:

转载于:https://www.cnblogs.com/aqing1987/p/4351932.html

实验题目1:班级学生学期成绩管理系统 (1)程序功能简介 灵活运用继承、对象成员等机制,设计一个能够实现班级学生学期成绩管理的程序。 (2)程序设计说明 ① 个人信息CPerson的数据成员有姓名、性别、年龄、身份证号等数据成员,成员函数根据需要自行设计; ② 学生CStudent从CPerson派生,并增加学号、CCourse对象成员数组(大小至少3个)等数据成员,并根据需要自行设计成员函数,包括能够求解所选修课程的总学分、显示某个学生基本信息课程信息的成员函数; ③ 课程CCourse包括课程名、学分、分数、任课老师等数据成员,成员函数根据需要自行设计; ④ 班级CClass的数据成员有班级名称、班级人数、CStudent对象成员数组(大小由构造函数确定)等。本班级CClass的对象成员数组需要在构造函数中用new动态分配内存空间,在析构函数中用delete释放。在CClass中设计包括能够求解最高成绩、最低成绩平均成绩以及通过学号查找并输出某个学生全部信息(例如Seek())等功能在内的成员函数; ⑤ 构造三十个学生的数据,每个学生都有三门课程成绩,输出并显示这些数据; ⑥ 根据的需要添加适当的其它成员,编写完整的程序并测试。 (3)程序调试运行 运行程序查看结果,并进行源代码调试优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值