不知道你看明白了没有, 看不明白请随便写个类试验下,我是这么做的,当然凡事也都有优缺点,下面简单对比下:
  使用impl 实现类
  不使用impl实现类
  优点
  类型定义与客户端隔离, 减少#include 的次数,提高编译速度,库端的类随意修改,客户端不需要重新编译
  直接,简单明了,不需要考虑堆分配,释放,内存泄漏问题
  缺点
  对于impl的指针必须使用堆分配,堆释放,时间长了会产生内存碎片,终影响程序运行速度, 每次调用一个成员函数都要经过impl->xxx()的一次转发
  库端任意头文件发生变化,客户端都必须重新编译
  改为impl实现后是这样的:
// 只用 file and cx 有虚函数.
#include "file.h"
#include "db.h"
class cx;
class error;
class old : public file, private db {
public:
old( const cx& );
db  get_db( int, char* );
cx  get_cx( int, cx );
cx& fun1( db );
error  fun2( error );
virtual std::ostream& print( std::ostream& ) const;
private:
class oldimpl* pimpl; //此处前向声明和定义
};
inline std::ostream& operator<<( std::ostream& os,const old& old_val )
{ return old_val.print(os); }
//implementation file old.cpp
class oldimpl{
std::list<cx> cx_list_;
deduce        dudece_d_;
};
  3. 删除不必要的类之间的继承
  面向对象提供了继承这种机制,但是继承不要滥用, old class 的继承属于滥用之一, class old 继承file 和 db 类, 继承file是公有继承,继承db 是私有继承
  ,继承file 可以理解, 因为file 中有虚函数, old 要重新定义它, 但是根据我们的假设, 只有file 和 cx 有虚函数,私有继承db 怎么解释?! 那么可能的理由是:
  通过 私有继承—让某个类不能当作基类去派生其他类,类似Java里final关键字的功能,但是从实例看,显然没有这个用意, 所以这个私有继承完全不必要, 应该改用包含的方式去使用db类提供的功能, 这样可以
  把"db.h"头文件删除, 把db 的实例也可以放进impl类中,终得到的类是这样的:
// 只用 file and cx 有虚函数.
#include "file.h"
class cx;
class error;
class db;
class old : public file {
public:
old( const cx& );
db  get_db( int, char* );
cx   get_cx( int, cx );
cx& fun1( db );
error  fun2( error );
virtual std::ostream& print( std::ostream& ) const;
private:
class oldimpl* pimpl; //此处前向声明和定义
};
inline std::ostream& operator<<( std::ostream& os,const old& old_val )
{ return old_val.print(os); }
//implementation file old.cpp
class oldimpl{
std::list<cx> cx_list_;
deduce        dudece_d_;
};
  小结一下:
  这篇文章只是简单的介绍了减少编译时间的几个办法:
  1. 删除不必要的#include,替代办法 使用前向声明 (forward declared )
  2. 删除不必要的一大堆私有成员变量,转而使用 "impl" 方法
  3. 删除不必要的类之间的继承