c语言封装继承详解

模块化编程结构

函数头文件

 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文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#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文件

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#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;

}

程序运行结果展示

相关推荐

  1. C语言封装继承,多态

    2024-02-08 18:38:02       30 阅读
  2. C++语言继承

    2024-02-08 18:38:02       32 阅读
  3. C++入门篇----封装继承,多态

    2024-02-08 18:38:02       60 阅读
  4. c++类的继承详解

    2024-02-08 18:38:02       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-08 18:38:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-08 18:38:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-08 18:38:02       87 阅读
  4. Python语言-面向对象

    2024-02-08 18:38:02       96 阅读

热门阅读

  1. Python并发

    2024-02-08 18:38:02       59 阅读
  2. Jgit Packfile is truncated解决方案

    2024-02-08 18:38:02       54 阅读
  3. leetcode-206-翻转链表

    2024-02-08 18:38:02       56 阅读
  4. 210 springcloud常见面试题

    2024-02-08 18:38:02       56 阅读
  5. 2.5作业

    2024-02-08 18:38:02       44 阅读
  6. 51单片机基础(C语言):定时器时钟

    2024-02-08 18:38:02       56 阅读
  7. 使用Spring AOP实现对外接口的日志自动打印

    2024-02-08 18:38:02       59 阅读