抽象有两种, 一种是数据抽象, 一种是行为抽象.
行为抽象是C++最重要的机制之一.
数据抽象:
int i = 5 ; // 你把5表示5个苹果, 5倍关系等等, 这就是数据抽象.
// 用数据去表示事物,概念,关系
行为抽象:
比如, 任何表现出迭代器行为的东西都是迭代器, 来自<
所以vector<>::iterator是迭代器, list<>::iterator是迭代器, 指针int* p也是迭代器
迭代器有哪些行为?
有解引用操作, 如*iter = 10,
有成员访问操作 iter->func(),
有递增操作 ++iter
所以只要你定义一个类, 支持上述操作, 你的类就是一个迭代器, 如果你的类同时又具有容器的行为, 你的类也可以叫做容器. 当然这种异型不太可能生存在有意义的环境中.
在C++中行为抽象一般有两种实现机制:
在面向对象的编程中, 使用接口
通常定义一个抽象类作为接口, 比如 class shape{ virtual void draw() ;}
任何继承该接口的子类, 都强制性的具有draw()行为, 所以任何子类都可叫做shape
在泛型编程中, 通常使用策略
策略是隐式接口, 在C/C++其实就等于convention(约定), 比如我们约定变量i开头表示int类型
template< typename T>
void draw( const T sp )
{
sp.draw() ; // 由于策略是隐式的, 只要求T具有draw()行为, 而不要求T之间有任何继承关系
}
抽象 = 提取共性, 忽略无关
所以
class polymorph
{
void draw() ; // polymorth是一个shape, 因为图形的行为共性是draw()
// 图形或许还有move(), scale()行为, 但是在这里我们忽略掉, 对我们不重要
void drive() ; // polymorth是一部汽车, 因为汽车的行为共性是drive()
// 汽车还有stop(),但是
} ;