在C语言里进行面向对象设计:模拟运行时识别计算机等级考试

文章作者 100test 发表时间 2010:01:02 06:59:16
来源 100Test.Com百考试题网


  面向对象的另一个特性是运行时识别。当然,如果你的系统设计的足够完美的话,也用不到什么运行时识别,但是有时使用一下运行是识别,能够是设计简化不少。言归正传,本文就是在前文的基础上再研究一下,如何使用 C 来进行运行时识别。
  我们知道, C 里的虚函数实际上不是与对象绑定,而是与类绑定的。也就是说,一个类一个虚函数表,而不是一个对象一个虚函数表。所以,如果一个类的虚函数较多时,像前文那样定义接口:
  struct IStream
  {
  void (*write)(IStream* pStream, char* pstr).
  void(*read)(IStream* pStream, char buf, ssize_t size).
  void (*flush)(IStream* pStream).
  …
  }.
  就会很浪费,因为每个对象都有 sizeof(struct IStream) 这么大。但是我们知道,虚函数表是与类绑定的,而不是与对象绑定的,那么我们可以改进这个设计。
  struct IStreamClass
  {
  void (*write)(IStream* pStream, char* pstr).
  void(*read)(IStream* pStream, char buf, ssize_t size).
  void (*flush)(IStream* pStream).
  …
  }.
  基类的定义改为:
  struct IStream{
  {
  struct IStreamClass* vtbl.
  }
  如果需要实现一个 FileStream 的话,可以定义一个具体类。
  struct FileStream
  {
  struct IStream base.
  FILE* f.
  }
  FileStreamClass 可以使用一个全局变量来定义:
  extern struct IStreamClass class_FileStream.
  因为这个虚函数表是与类绑定的,所以有了它,我们还可以增加运行时识别的功能!
  int isFileStream(struct IStream* pStream){
  return pStream-

相关文章


约瑟夫环问题求解算法C语言源代码计算机等级考试
C语言与Python程序运行效率对比计算机等级考试
MP3文件的结构与编程计算机等级考试
用C语言解析BMP文件的结构计算机等级考试
在C语言里进行面向对象设计:模拟运行时识别计算机等级考试
linux获取接口IP的方法计算机等级考试
用C写的汉诺塔(hanoi)程序计算机等级考试
scanf和gets获取字符串时的区别计算机等级考试
C语言函数调用约定计算机等级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛