C 语言面向对象-- 继承

在Java语言中,如果我们想实现继承,那我们会这样写。
比如我们要定义一个 Person 类,然后定义一个Student 类继承自Person 类,

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "I am a " + this.getClass().getSimpleName() + ", my name is " + getName() + ", " + getAge()
                + " years old";
    }

}

然后定义一个Student 类继承自 Person:

public class Student extends Person {

    private String school;

    public Student(String name, int age) {
        super(name, age);
    }

    public void setSchool(String school) {
        this.school = school;
    }

    public String getSchool() {
        return school;
    }

    @Override
    public String toString() {
        return super.toString() + ", study in " + getSchool();
    }
}

然后我们这样使用它们。

Person person = new Person("jerry", 27);
System.out.println(person.toString());
Student student = new Student("jerry", 27);
student.setSchool("Shanghai high school");
System.out.println(student.toString());

输出结果为:

I am a Person, my name is jerry, 27 years old
I am a Student, my name is jerry, 27 years old, study in Shanghai high school

那么我们在C语言里可以怎么去实现呢。其实我们就是在结构体里面包含一个指向”父类”的结构体指针就好了。Person 的定义

typedef struct _person{
    char name[128];
    int age;
    void (*setName)(struct _person * person, char* name);
    void (*setAge)(struct _person * pseron,int age);
    char *(*getName)(struct _person * person,int *len);
    int (*getAge)(struct _person * pseron);
}Person;


static void setName(struct _person * person, char* name){
    if(person == NULL)
        return;
    memcpy(person->name, name, strlen(name));
    return;
}

static void setAge(struct _person * person,int age){
    if(person == NULL)
        return;
    person->age = age;
    return;
}
static char * getName(struct _person * person, int *len){
    if(person == NULL)
        return NULL;
    *len = strlen(person->name);
    return person->name;
}
static int getAge(struct _person * person){
    if(person == NULL)
        return -1;
    return person->age;
}

Person * Person_new(char * name, int age){
    Person * person = NULL;
    person = (Person *)malloc(sizeof(Person));
    memset(person, 0, sizeof(Person));

    person->getAge = getAge;
    person->getName = getName;
    person->setName = setName;
    person->setAge = setAge;

    memcpy(person->name, name, strlen(name));
    person->age = age;
    return person;
}

void Person_delete(Person * person){
    if(person == NULL)
        return;
    free(person);
    return;
}

然后是Student

typedef struct _student{

    Person *person;
    char school[128];
    void (*setSchool)(struct _student * student, char *school);
    char * (*getSchool)(struct _student * student, int *len);
    void (*setName)(struct _student * student, char* name);
    void (*setAge)(struct _student * student,int age);
    char *(*getName)(struct _student * student,int *len);
    int (*getAge)(struct _student * student);


}Student;




static void setSchool(struct _student * student, char *school){

}
static char * getSchool(struct _student * student, int *len){
    return NULL;
}


static void stu_setName(struct _student * student, char* name){
    if(student == NULL)
        return;
    student->person->setName(student->person,name);
    return;
}

static void stu_setAge(struct _student * student,int age){
    if(student == NULL)
        return;
    student->person->setAge(student->person,age);
    return;
}
static char * stu_getName(struct _student * student, int *len){
    if(student == NULL)
        return NULL;

    return student->person->getName(student->person, len);
}
static int stu_getAge(struct _student * student){
    if(student == NULL)
        return -1;
    return student->person->getAge(student->person);
}

Student *Student_new(char * name, int age){
    Student * student = NULL;
    student = (Student *) malloc(sizeof(Student));
    memset(student, 0, sizeof(Student));
    student->person = Person_new(name, age);
    student->getSchool = getSchool;
    student->setSchool = setSchool;
    student->getAge =stu_getAge;
    student->getName = stu_getName;
    student->setName = stu_setName;
    student->setAge = stu_setAge;

    return student;
}

void Student_delete(Student * student){
    if(student == NULL)
        return;
    Person_delete(student->person);
    free((void *)student);
    return;
}

我们这样使用 Student :

    int len;
    Student *student = Student_new("tom", 15);
    printf("Hello, my name is %s, %d years old \n", student->getName(student, &len),student->getAge(student));

    Student_delete(student);
    student = NULL;

输出结果为:

Hello, my name is tom, 15 years old 

这样我们就实现了Student 集成 Person 当然这里为了方便使用,而且尽量让代码比较接近我们使用的面相对象语言,在Student 中把Person 提供的方法都重写的了一遍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值