精慕HU
首先要知道类存在的理由,为何要面向对象。C中的结构体就是定义一种数据格式,可以存储若干数据元素,并且它们的内存是连续的。结构体的作用是封装一组有关联的属性,它们共同维护某种概念实体的状态。在早期经典纯C工程当中,有经验的开发者早就开始利用结构体与函数指针实现简单的面向对象。但是用结构体+函数指针使用不方便不灵活,所以C++最大的使命,面向对象就诞生了。要注意的是C++与C的区别除了类之外,还有函数多态的特性、命名空间、STL等等特性。类相比于结构体+函数指针最大的优势就是两个字:继承撤了一大堆废话,针对LZ的问题可以归结为,在没有属性的时候,只有函数,使用类好不好,或者说何时可以如此使用。如果LZ学习过设计模式,那么这个问题就颇为清晰,类的存在是为了更灵活地描述某种概念实体以及对它的操作。一个只有函数而没有属性的类,其描述的实体可以认为是一种抽象的动作实体。用通俗的话来讲,一个继承Animal的Cat类描述一个猫,猫有属性(形态,叫声,年龄等),也有动作(吃喝拉撒睡),这就是最经典LZ也熟知的一种类。而抽象的动作类,就有比如一个继承File的DiskFile或者FtpFile等,它主要描述的是一组动作(读与写),它也许有状态(属性),也许没有。这种抽象的动作类为何而存在?经典的策略设计模式就会大量地使用这种写法。比如你要做视频处理软件,视频需要解码与加码如果只是用纯函数的化你的代码就会如下丑陋:1234567891011if(0 == strcmp(fileType, AVI)) { decode_AVI(file);} else if(0 == strcmp(fileType, MP4)) { decode_MP4(file);}.....if(0 == strcmp(fileType, AVI)) { encode_AVI(file);} else if(0 == strcmp(fileType, MP4)) { encode_MP4(file);}但是如果你有一个类AVType,只有两个函数:encode、decode,然后有AVIType、MP4Type继承它,那么你的代码大致就是:1234AVType* type = new AVIType(); // or MP4Typetype->decode(file);....type->encode(file);当你的同类方法多起来(如rmvb、wmv、flv解码器等等),你就会发现后者有多优秀。最后总结对LZ的问题的回答就是:如果没有继承也不会存在潜在继承的可能,也就是说用不到C++的多态特新,那么没有属性的类就没有存在的必要。