谁说C的结构不能实现类的功能: struct tagCClass; typedef struct tagCClass CClass; int Fuc1(int ,int); int Fnc2(char*);void Class_Init(CClass* this ) { this->classmember1 = 0; this->classmember2 = 0; this->MemberFunc1 = func1; this->MemberFunc2 = fucn2; }
struct tagCClass { int classmember1; int classmember2; int (*MemberFunc1)(int,int); int (*MemberFunc2)(char*); } 虽然在单纯的C语言中没有继承性,但数据的封装是可以实现的。
C++ 能实现的, C 全能实现! 只不过你们不懂而已。 用过 SCO 的同学们不妨看看 C++ 的编译程序 CC 到底是个什么东西!其实就是一个批处理,最后还是用 cc -- C 的编译程序来编译的。在 yndfcd(YNDFCD)的例子中,如果将 int Fnc2(char*); 改成 static int Func2(char*); 效果会更好!
{
int i;
char c;
int geti()
{
return i;
}
};
int main(int argc, char* argv[])
{
struct cls test;
test.i = 6;
printf("%d\n", test.geti());
return 0;
}
上述代码用.cpp文件可以编译,但用.c的不行,报function cannot be member of struct 'cls'错,说明纯C不支持结构体实现类。
{
int i;
char c;
int geti()
{
return i;
}
};
int main(int argc, char* argv[])
{
cls test;
test.i = 6;
printf("%d\n", test.geti());
return 0;
}
用子函数实现好了,
typedef struct VFS{
char fsname[256];
struct fsfile *filep; /* 指向某种文件系统的文件结构类型 */
typedef union fss{ /* 确定安装的文件类型 */
msdos,
ext2,
ext3,
iso9660,
ffs,
ufs,
ntfs,
,,,} *fsp; struct fss *iop{
fsp * read;
fsp * write;
fsp * open;
...
};
....
};
写得可能有误,但基本思想是这样的。
但其实是系统调用又调用相应的FS的操作,这样就实现了对程序员“隐藏”设备特性的目的,也就是“封装”,这样也实现了“一致的I/O"操作,这样也实现了将”设备“同”文件“一样的操作,所以有”设备文件“这个术语。
可以参阅linux的fs 和 IO 部分,还可以去看看系统调用的声明部分,你会发现,系统调用其实是指向函数的指针,这样也实现了”多态“和”重载“!
可以用一级指针实现“类”,就可以用二级,三级指针实现“继承”!
单继承相对来说简单些,而多继承就难得多了,但Java就仅提供单继承,
因为多继承会带来语义上的问题,所以Java不支持,而C++是源自C,是可以
以上述机制实现的,所以支持!
怎么实现呢?可以肯定的说,C是非常灵活的,她是可以模拟任何语言特征的,关键是程序员的设计思想问题。否则,C++怎么能在C的基础上实现呢?
是FS和I/O部分,无论是windows,还是Linux,都是用前述机制实现“设备驱动程序”的,在网络部分,由于要兼容各种协议,也用了上述机制,比如NetBIOS,TCP/IP,IPX/SPX等。注意,现代操作系统大都是用C,而不是C++!
但现代操作系统几乎都用了面向对象的机制!Windows2000/XP上,这个特征是
非常明显的!推荐源码《操作系统设计与实现(上/下册)》,是minix源码。
参考《windows操作系统原理》,《linux编程白皮书》。
struct tagCClass;
typedef struct tagCClass CClass;
int Fuc1(int ,int);
int Fnc2(char*);void Class_Init(CClass* this )
{
this->classmember1 = 0;
this->classmember2 = 0;
this->MemberFunc1 = func1;
this->MemberFunc2 = fucn2;
}
struct tagCClass
{
int classmember1;
int classmember2;
int (*MemberFunc1)(int,int);
int (*MemberFunc2)(char*);
}
虽然在单纯的C语言中没有继承性,但数据的封装是可以实现的。
只不过你们不懂而已。
用过 SCO 的同学们不妨看看 C++ 的编译程序 CC 到底是个什么东西!其实就是一个批处理,最后还是用 cc -- C 的编译程序来编译的。在 yndfcd(YNDFCD)的例子中,如果将
int Fnc2(char*);
改成
static int Func2(char*);
效果会更好!
语言只不过是工具, 最重要的是思想.