请写一个使用glib编写的面向对象风格的代码示例,体现封装、继承、多态
时间: 2024-02-06 20:04:41 浏览: 83
好的,以下是一个使用glib编写的面向对象风格的代码示例,其中体现了封装、继承、多态:
```c
#include <glib.h>
// 基类 Animal
typedef struct _Animal {
gchar *name;
guint age;
} Animal;
// Animal 方法
void animal_set_name(Animal *animal, gchar *name) {
g_free(animal->name);
animal->name = g_strdup(name);
}
void animal_set_age(Animal *animal, guint age) {
animal->age = age;
}
void animal_say_hello(Animal *animal) {
g_print("Hello, I'm %s.\n", animal->name);
}
// 派生类 Dog
typedef struct _Dog {
Animal parent;
gchar *breed;
} Dog;
// Dog 方法
void dog_set_breed(Dog *dog, gchar *breed) {
g_free(dog->breed);
dog->breed = g_strdup(breed);
}
void dog_say_hello(Dog *dog) {
g_print("Hello, I'm a %s dog named %s.\n", dog->breed, dog->parent.name);
}
// Animal 构造函数
Animal *animal_new(gchar *name, guint age) {
Animal *animal = g_new(Animal, 1);
animal->name = g_strdup(name);
animal->age = age;
return animal;
}
// Dog 构造函数
Dog *dog_new(gchar *name, guint age, gchar *breed) {
Dog *dog = g_new(Dog, 1);
dog->parent.name = g_strdup(name);
dog->parent.age = age;
dog->breed = g_strdup(breed);
return dog;
}
int main() {
Animal *animal = animal_new("Tom", 3);
animal_say_hello(animal);
Dog *dog = dog_new("Snoopy", 5, "Beagle");
animal_say_hello((Animal *) dog);
dog_say_hello(dog);
g_free(animal->name);
g_free(animal);
g_free(dog->parent.name);
g_free(dog->breed);
g_free(dog);
return 0;
}
```
在上面的代码中,Animal 是基类,Dog 是派生类。Animal 包含了 name 和 age 两个成员变量,以及 animal_set_name、animal_set_age 和 animal_say_hello 三个方法。Dog 继承了 Animal,并新增了 breed 成员变量,以及 dog_set_breed 和 dog_say_hello 两个方法。animal_new 和 dog_new 分别是 Animal 和 Dog 的构造函数,用于初始化对象。在 main 函数中,分别创建了一个 Animal 和一个 Dog 对象,并调用了相应的方法。
这个代码示例中体现了封装,Animal 和 Dog 的成员变量和方法都是私有的,外界无法直接访问。同时也体现了继承,Dog 继承了 Animal 的属性和方法。最后,dog_say_hello 方法通过多态的方式覆盖了 animal_say_hello 方法,体现了多态。
阅读全文