c语言封装继承详解

模块化编程结构

c语言封装继承详解_第1张图片

函数头文件

c语言封装继承详解_第2张图片

 c语言头文件代码

#ifndef __Object_H_
#define __Object_H_

// 继承
struct person {
    int id;
    char name[20];
    int gender;
    const char* (*getGender)(struct person* s);
    void (*setGender)(struct person* s, const char* strGender);
};
struct teacher {
    struct person super;
    char subject[20];

};
struct student {
    struct person super;
    int mark;
    void (*setStudentId)(struct student* s, int year, int classNum, int serialNum);
};


void initPerson(struct person* p);
void initStudent(struct student* s);
void initTeacher(struct teacher* t);
void setStudentId(struct student* s, int year, int classNum, int serialNum);
const char* getGender(struct person* s);
void setGender(struct person* s, const char* strGender);



#endif

函数util文件

c语言封装继承详解_第3张图片

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include "Object.h"
// 初始化函数指针
void initPerson(struct person* p) {
    p->getGender = getGender;
    p->setGender = setGender;
}
// 初始化函数
void initStudent(struct student* s) {
    initPerson(&(s->super));
    s->setStudentId = setStudentId;
}
// 初始化函数
void initTeacher(struct teacher* t) {
    initPerson(&(t->super));
}
// 学生的学号
void setStudentId(struct student* s, int year, int classNum, int serialNum) {
    char buffer[20];
    // sprintf的作用是字符拼接,将结构传入第一个参数buffer指示的字符当中
    sprintf(buffer, "%d%d%d", year, classNum, serialNum);
    // 函数atoi将指示的字符串转换为整型并返回结果
    int id = atoi(buffer);
    // 使用面向对象的方式直接给结构体中的成员id赋值
    s->super.id = id;
}

const char* getGender(struct person* s) {
    if (s->gender == 0) {
        return "女";
    }
    else if (s->gender == 1) {
        return "男";

    }
    return "佚名";

}
// 将字符串表示的性别转换为整型表示的性别进行处理
void setGender(struct person* s, const char* strGender) {
    int numGender;
    if (strcmp("男", strGender) == 0) {
        numGender = 1;
    }
    else if (strcmp("女", strGender) == 0) {
        numGender = 0;
    }
    else {
        numGender = -1;
    }
    s->gender = numGender;
}

c语言函数main文件

c语言封装继承详解_第4张图片

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include "Object.h"



int main() {
    // 结构体的声明
    struct student stu;
    // 函数体在使用过程中需要调用initStudent函数设置正确的指向
    initStudent(&stu);
    // 直接调用函数传入结构体指针
    setStudentId(&stu, 2023, 607, 12);
    strcpy(stu.super.name, "小明");
    stu.super.setGender(&stu.super, "男");
    stu.mark = 98;

    // 使用printf打印输出相关数据,采用点的方式对函数进行调用
    printf("学号:%d\n", stu.super.id);
    printf("姓名:%s\n", stu.super.name);
    // 将数字1和0转换为字符串男和女
    const char* gender = stu.super.getGender(&stu.super);
    printf("性别%s\n", gender);
    printf("分数%d\n", stu.mark);
    putchar('\n');
    struct teacher t;

    //  初始化teacher
    initTeacher(&t);

    t.super.id = 12345;
    strcpy(t.super.name, "林老师");
    t.super.setGender(&t.super, "男");
    strcpy(t.subject, "C语言");

    //  打印这些数值
    printf("学号:%d\n", t.super.id);
    printf("姓名:%s\n", t.super.name);
    gender = t.super.getGender(&t.super);
    printf("性别:%s\n", gender);
    printf("科目:%s\n", t.subject);



    return 0;

}

程序运行结果展示

c语言封装继承详解_第5张图片

你可能感兴趣的:(c语言,开发语言)