C++8种常见类类型
前言
大部分面向对象开发工作中都应用了以下部分或者全部的基本类别的类:
1、具体类(concrete class)
2、抽象类(abstract class)
3、接口类(interface class)
4、节点类(node class)
5、支持类(support class)
6、域类(domain class)
7、应用类(utility class)
8、集合和容器类(collection and container class)
这些类并不是特定的语言结构,而是用于实现逻辑类的技术。
类类型 | 描述 |
---|---|
具体类 | 独立类;表示一个祖先-后代世系终止的结束类 |
抽象类 | 为所有的子类提供布局和蓝图的基准类,不能声明此类的对象;必须派生新的类,对抽象的基本中声明任何虚函数提供定义 |
接口类 | 用于修改或者增强另外一个类得接口,为了非面向对象代码和数据,提供面向对象性,而用来封装独立函数 |
节点类 | 提供了继承和多态的基础;不包含纯虚函数 |
域类 | 创建类在指定域内部模拟部分现实或者实体 |
支持 /应用类 | 不管在任何域内,对于不同的应用都非常有用 |
集合和容器类 | 其他对象组的一般性容纳器 |
具体类
具体类是作为结束类而设计和实现的,表示祖先-后代世系的终止,所以并不适合相关类的一般系统,每个具体类都不必参考其他类就可以单独理解。
具体类可以在它的实现中得到优化,因为没有必要去单担心派生类中的功能性;
所以具体类是线程处理中多线程类的理想候选者,在线程化时,不必考虑派生类中出现的覆盖或者重载重要线程化成员函数。
抽象类
抽象类是为所有后代提供蓝图的类,所以实际上,抽象类也就仅仅是一个蓝图罢了,用户也不能声明一个抽象类的对象,为了使用抽象类,用户必须首先从基类中派生出一个新类,而且其为抽象类中声明的所有纯虚函数提供实际定义,默认情况下,抽象类至少需要一个后代,才可以发挥出作用。
此外,为了让一个类成为抽象类,至少需要一个纯虚函数。
class A{ public: virtual void lock(void)=0; virtual void unlock(void)=0; virtual ~A(void); }
而类B则从类A中派生出来:
class B:public A{ protected: pthread_,mutex_t x; public: B(void); ~B(void); virtual void lock(void) {pthread_mutex_lock(x);} virtual void unlock(void) {pthread_mutex_unlock(x);} }
不能直接声明抽象类:
A MemoryLock; //非法的
B MemoryLock; //合法的
接口类
类用户可用的数据成员和成员函数组成了该类的接口,C++对于类有3种访问策略:
1、私有(private)
2、受保护(protected)
3、公有(public)
其中:
1、当数据成员和成员函数为私有的时,它们仅仅只能被中间类的成员函数访问,无法被非该类的成员函数所访问;
2、类的成员函数和数据成员为受保护的时,它们可以被类的中间成员和该类的所有后代所访问,但该类之外的函数无法访问
3、类可以将成员函数和数据成员声明为公有的,则不管是什么类的成员,都可以访问被定义为public的接口和成员
例如以下,这可以保护敏感函数或者变量:
class mutex{ protected; pthread_mutex_lock x; public: lock() {pthread_mutex_lock(&x);} unlock() {pthread_mutex_unlock(&x);} };
节点类
节点类是继承和多态的基础,与抽象类一样,节点类设计用于继承,但是不同的是,节点类不包含纯抽象函数,其可以直接使用。
节点类提供了可以直接被派生类继承的受保护的数据成员和成员函数,它使用基类的指针允许在后代类中操纵成员函数,用户可以通过多态和继承来特殊化节点类。
节点类既可以是基类,也可以是派生类。
域类
域类是一种创建用来模拟指定域内实体的类,类的意义特定于该域;
支持/应用类
这一类和域毫无关系,可以跨域使用,其在不同的应用程序上都非常有用,例如日期类、时间类、计量类等等。
集合和容器类
这一类主要充当了其他类或者对象的容纳器对象。
容器类 | 类型 |
---|---|
Stack | List |
Queue | Associative Array |
Deque | Graph |
Set | Tree |
Multiset | Table |
实现集合和容器类的两个方法:
1、基于对象途径;
2、基于模板途径;
其中基于对象结构非常依赖于多态和继承,产生了高度纵向的集合和容器结构;
基于模板的结构则十分依赖于C++中模板结构的一般性功能,并且产生集合和容器类的横向结构;