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


    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
    ", 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;
    }

    执行结果如下:

  • 相关阅读:
    第三届“百越杯”福建省高校网络空间安全大赛Do you know upload?
    [百度杯-二月场](Misc-Web)爆破-3
    屌丝程序员的梦想 (一)
    屌丝程序员寻爱记(一)
    MYSQL里使用正则的速度快还是使用like模糊查询语句快?
    mybatis源码探究(-)MapperProxyFactory&MapperProxy
    设计模式-责任链模式在实际项目中的使用
    java8的正确使用姿势
    Guava EventBus集成spring
    jenkins中集成commander应用
  • 原文地址:https://www.cnblogs.com/aqing1987/p/4351932.html
Copyright © 2020-2023  润新知