/* simple_cat.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 10 typedef struct Animal{ void *this; char name[MAX]; void (*shout)(struct Animal *); }Animal; typedef struct Cat{ Animal *animal; }Cat; void shout_cat(Animal *cat) { printf("%s miaomiao. \n", cat->name); } void visit_animal(Animal *animal) { animal->shout(animal); } void initialize_cat(Cat* cat, char *name) { cat->animal = (Animal *) malloc(sizeof(Animal)); cat->animal->this = cat; cat->animal->shout = shout_cat; strcpy(cat->animal->name, name); } void finalize_cat(Cat *cat) { free(cat->animal); } void main() { Cat cat; initialize_cat(&cat, "Kitty"); visit_animal(cat.animal); finalize_cat(&cat); }
写道
Kitty miaomiao.
Kitty cannot swim.
Kitty cannot swim.
#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <conio.h> #define MAX 10 typedef struct Animal{ void *this; char name[MAX]; void (*shout)(struct Animal *); }Animal; typedef struct Swimmable{ void *this; void (*swim)(struct Swimmable *); }Swimmable; typedef struct Dog{ Animal *Animal; Swimmable *Swimmable; }Dog; typedef struct Cat{ Animal *Animal; Swimmable *Swimmable; }Cat; void shout_Cat(Animal *cat){ printf("%s miaomiao.\n", cat->name); } void swim_Cat(Swimmable *cat){ printf("%s cannot swim.\n", ((Cat *)(cat->this))->Animal->name); } void shout_Dog(Animal *dog){ printf("%s wangwang.\n", dog->name); } void swim_Dog(Swimmable *dog){ printf("%s can swim.\n", ((Dog *)(dog->this))->Animal->name); } void visit_Animal(Animal *animal){ animal->shout(animal); } void visit_Swimmable(Swimmable *swimmable){ swimmable->swim(swimmable); } void initialize_Dog(Dog* dog, char *name){ dog->Animal = (Animal *) malloc(sizeof(Animal)); dog->Animal->this = dog; dog->Animal->shout = shout_Dog; strcpy(dog->Animal->name, name); dog->Swimmable = (Swimmable *) malloc(sizeof(Swimmable)); dog->Swimmable->this = dog; dog->Swimmable->swim = swim_Dog; } void initialize_Cat(Cat* cat, char *name){ cat->Animal = (Animal *) malloc(sizeof(Animal)); cat->Animal->this = cat; cat->Animal->shout = shout_Cat; strcpy(cat->Animal->name, name); cat->Swimmable = (Swimmable *) malloc(sizeof(Swimmable)); cat->Swimmable->this = cat; cat->Swimmable->swim = swim_Cat; } void finalize_Dog(Dog *dog){ free(dog->Animal); free(dog->Swimmable); } void finalize_Cat(Cat *cat){ free(cat->Animal); free(cat->Swimmable); } void main(){ Dog dog; Cat cat; //clrscr(); initialize_Dog(&dog, "Wangcai"); initialize_Cat(&cat, "Kitty"); visit_Animal(dog.Animal); visit_Animal(cat.Animal); visit_Swimmable(dog.Swimmable); visit_Swimmable(cat.Swimmable); finalize_Dog(&dog); finalize_Cat(&cat); }
写道
Wangcai wangwang.
Kitty miaomiao.
Wangcai can swim.
Kitty cannot swim.
Kitty miaomiao.
Wangcai can swim.
Kitty cannot swim.
相关推荐
### NTCIP Class A 和 Class C 类别简介 #### 一、引言 《NTCIP Class A and Class C Class Profiles》是美国州际公路与运输官员协会(AASHTO)、交通工程师学会(ITE)及国家电气制造商协会(NEMA)联合发布的...
用于支持对H3C云教室的安装帮助,从网络规划到虚拟化平台直至安装完成云学堂的详细步骤。 本来
本文主要谈了一下 C语言中class和struct的区别。
U9 数据字典 Classview,最全数据字典 。
在实际应用中,我们需要结合C语言的加密算法和Java的JNI接口,编写相应的Java代理和C函数,以便在JVM启动时加载并解密.class文件。 总的来说,这个技术组合涉及到多层安全措施,从代码的存储安全(加密)到运行时的...
php文件上传类 UPLOAD.CLASS、在php100中文网下载 重命名等方法
《cClass:Terraria插件开发详解》 在游戏编程领域,Terraria是一款深受玩家喜爱的沙盒式冒险游戏,而cClass则是针对这款游戏的插件开发框架,它允许开发者通过C#语言来扩展游戏的功能,提升玩家的游戏体验。本文将...
Class c = p.getClass(); ``` 这种方式需要先创建一个对象,然后通过getClass()方法获取Class对象。 方式2:通过类名.class获取Class对象 通过类名.class可以获取Class对象,例如: ```java Class c2 = Person....
C语言day03 - class.c
vue点击给dom添加class然后获取含有class的dom <div class=chose-ck v-for=(item,index2) key=index2 ref=chosebox> <p>{{item.name}} <dt v-for=(item2,index) in item....'check':'' :id=item2.id :data-c
c:/java/>jad example1.class 这将将 example1.class 反编译成 example1.jad。将 example1.jad 改为 example1.java 即得源文件。 三、JAD 反编译工具的高级用法 JAD 反编译工具提供了多种高级用法,可以满足不同...
该振荡器采用class-C工作模式的核心晶体管,与标准差分对LC谐振振荡器相比,在相同的电流消耗下实现了理论上的3.9dB相位噪声改善。此外,该拓扑自然排斥尾偏置电流噪声,并且不存在对杂散电容敏感的寄生节点,从而...
### 基于有限谐波数量的Class-E、Class-C及Class-F功率放大器 #### 概述 本文深入探讨了在超高频(UHF)和微波频率下实现Class-E功率放大器(PA)的方法,该方法通过传输线网络提供理想的Class-E功率放大器所需的...
能学到什么:了解 IEC 60730 A、B、C三类功能安全定义,以及如何在软件中实现 MCU 自检。 阅读建议:Class B 安全功能认证不仅仅需要软件有对应实现,还需要提供相应的软件模块设计文档,理解自检的原理,有助于我们...
定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2()。在主函数中声明一个DerivedClass的对象,分别用DerivedClass的对象以及BaseClass和...
其中,`class-dump-z` 是一款广受欢迎的工具,尤其在iOS开发中,用于提取Objective-C类信息和方法。而今天我们要讨论的是它的全平台版本,包括Linux、iPhone和Windows,这大大扩展了其适用范围。 `class-dump-z` 的...
npm install vue-class-component vue-property-decorator --save-dev 一梭子直接干; 其次,咱来说说它们的区别与联系: vue-property-decorator社区出品;vue-class-component官方出品 vue-class-component提供了...
《Brocade 4Gb SAN Switch for HP c-Class BladeSystem安装指南》 Brocade 4Gb SAN Switch是一款专为HP c-Class BladeSystem设计的四千兆光纤通道交换机模块,适用于高密度、高性能的存储区域网络(SAN)环境。此...
Objective-C头文件导出工具class-dump 。 Current version: 3.4 (64 bit Intel) Requires Mac OS X 10.7 or later. class-dump 3.4 (64 bit) Usage: class-dump [options] where options are: -a show instance...
《class-dump-3.5:深入探索Objective-C类信息》 在iOS和macOS的开发中,Objective-C作为主要的编程语言之一,其强大的动态性使得开发者能够灵活地处理类和对象。然而,这种灵活性有时也会带来调试的挑战。这时,一...