使用glib写一个demo,要使用glib的面向对象规则,并体现继承、多态的特点
时间: 2024-02-21 11:00:43 浏览: 107
好的,以下是一个使用glib编写的面向对象风格的demo,其中体现了继承、多态的特点:
```c
#include <glib.h>
// 基类 Person
typedef struct _Person {
gchar *name;
guint age;
} Person;
// Person 方法
void person_set_name(Person *person, gchar *name) {
g_free(person->name);
person->name = g_strdup(name);
}
void person_set_age(Person *person, guint age) {
person->age = age;
}
void person_say_hello(Person *person) {
g_print("Hello, I'm %s.\n", person->name);
}
// 派生类 Student
typedef struct _Student {
Person parent;
gchar *school;
} Student;
// Student 方法
void student_set_school(Student *student, gchar *school) {
g_free(student->school);
student->school = g_strdup(school);
}
void student_say_hello(Student *student) {
g_print("Hello, I'm a student of %s named %s.\n", student->school, student->parent.name);
}
// Person 类型的构造函数
Person *person_new(gchar *name, guint age) {
Person *person = g_new(Person, 1);
person->name = g_strdup(name);
person->age = age;
return person;
}
// Student 类型的构造函数
Student *student_new(gchar *name, guint age, gchar *school) {
Student *student = g_new(Student, 1);
student->parent.name = g_strdup(name);
student->parent.age = age;
student->school = g_strdup(school);
return student;
}
int main() {
Person *person = person_new("Tom", 20);
person_say_hello(person);
Student *student = student_new("John", 18, "Harvard");
person_say_hello((Person *) student);
student_say_hello(student);
// 多态的体现
Person *p = (Person *) student;
person_say_hello(p); // 调用 Person 的方法
student_say_hello((Student *) p); // 调用 Student 的方法
g_free(person->name);
g_free(person);
g_free(student->parent.name);
g_free(student->school);
g_free(student);
return 0;
}
```
在这个demo中,Person 是基类,Student 是派生类。Person 包含了 name 和 age 两个成员变量,以及 person_set_name、person_set_age 和 person_say_hello 三个方法。Student 继承了 Person,并新增了 school 成员变量,以及 student_set_school 和 student_say_hello 两个方法。person_new 和 student_new 分别是 Person 和 Student 的构造函数,用于初始化对象。在 main 函数中,分别创建了一个 Person 和一个 Student 对象,并调用了相应的方法。
这个demo中体现了继承,Student 继承了 Person 的属性和方法,并新增了自己的成员变量和方法。同时也体现了多态,p 是一个 Person 类型的指针,但实际上指向的是一个 Student 对象,所以在调用 person_say_hello 方法时会调用 Student 的方法,而在调用 student_say_hello 方法时会调用 Person 的方法。
总之,这个demo中使用了glib的面向对象规则,体现了继承、多态的特点。
阅读全文