DoMyAct_Do();//不要理会具体的什么样的动作,just do it } FREE ALL。 在微系统里面,比如嵌入式,通常使用对象池的技术,这个时候可以不用考虑释放的问题(对象池预先没有空间,使用Attach,在某个函数中申请一个数组并临时为对象池分配空间,这样函数结束,对象池就释放了) 但是在Pc环境下,由于程序规模比较大,更重要的是一些特殊的要求,使得对象的生命周期必须延续到申请的那个函数体以外,就不得不使用malloc,实际上即使在C++中,new对象的自动释放始终是一个令人头疼的问题,新的标准引入了智能指针。但是就我个人而言,我觉得将内存释放的问题完全的交给机器是不可信任的,它只能达到准最佳。 你知道设计Java的垃圾回收算法有多困难吗?现实世界是错综复杂的,在没有先验条件下,要想得到精确的结果及其困难。所以我说程序员要时刻将free记在心上,有关程序的健壮性和自我防御将在另外一篇文章中讲述。 3.纯虚结构的退化 下面我们来看看如果struct里面仅仅有一个函数是什么? 这个时候如果我们不使用struct,仅仅使用函数指针又是什么? 我们发现,这样就退化为普通的函数指针的使用了。 所以说,有的时候我觉得面向对象仅仅是一种形式,而不是一种技术。是一种观点,而不是一种算法。但是,正如炭,石墨和钻石的关系一样,虽然分子式都是C,但是组成方法不一样,表现就完全不一样了! 有的时候,我们经常被编程中琐碎的事情所烦恼,而偏离了重心,其实程序可进化的特性是很重要的。有可能,第一次是不成功的,但是只要可进化,就可以发展。 4.进阶――类结构树,父类不是纯虚类的类 前面仅仅讲的是父类是纯虚结构的情况 (面向对象建议的是所有类的基类都是从纯虚类开始的), 那么当类层次比较多的情况下,出现父类不是纯虚结构怎么办呢。嘿嘿,其实在C中的实现比C++要简单多了。因为C中各个函数是分散的。 在这里使用宏定义是一个很好的办法:比如两个类Act1,ActByOther1“继承”Act1: MyVirtualInterface* ActByOther1_CreatInterface() { index=FindValid() //对象池或者使用Malloc if(index==-1) return NULL; St[index].Foo1= ActByOther1_Foo1; // Act1_Foo1要在下面具体实现 St[index].Foo2= ActByOther1_Foo2; St[index].Foo3= ActByOther1_Foo3; Return &st [index]; } #define ActByOther1_Foo1 Act1_Foo1 //这就是继承 嘿嘿 ActByOther1_Foo2(){} // 可以修改其实现 ActByOther1_DoByOther() {} //当然就可以添加新的实现咯 5.实例――可以参见H264的源码,其中NalTool就是这样的一个纯虚结构。 |