感谢slimzhao的博文消除了我的迷惑,博文原文地址为
http://blog.chinaunix.net/uid-53564-id-3259704.html
我在读Effective C++ 中文版的第31条,倒数第二段的原文——“最后,不论Handle classes或Interface classes,一旦脱离inline函数都无法有太大作为。”——始终无法理解,为什么Handle Class 和 Interface classes必须要依赖inline函数。
Handle Class的原型类似
//声明实现细节其中,ImplementClass 被定义在其他的头文件中,而那个文件是不会提供给HandleClass类的用户的。
class ImplementClass;
//定义类本体
class HandleClass{
public:
int Interface(void);
private:
ImplementClass* pImpl;
}
所以说,Handle class 的最大意义在于:完全将接口与实现细节分离,达到封装的目的。
所以基于此,当ImplementClass类,也就是实现细节被修改时,当然不会重新编译整个工程,因为实现细节已经被良好封装了。
另一方面,Interface class的原型类似
//定义抽象基类作为接口类用户使用BaseClass提供的接口设计函数,这种设计的函数可以根据具体传入的派生类类型,调用正确的派生类版本的实现代码。例如,传入的是DeriveClass类的实例的指针,则会自动调用DeriveClass版本的接口实现代码。
class BaseClass{
public:
virtual ~BaseClass();
virtual int Interface1(void) = 0;
virtual int Interface2(int,float) = 0;
virtual double Interface3(double) = 0;
...
}
// 定义具体类如下
class DeriveClass{
public:
DeriveClass(){...}
virtual ~DeriveClass(){...}
virtual int Interface1(){...}
virtual int Interface2(int ivar, float fvar){...}
virtual double Interface3(double dvar){...}
private:
...//一些成员变量
}
这种设计模式是典型的“工厂模式”,
Interface class的最大优点在于可以使用“基类接口操作派生类对象。
所以,由于用户代码中只有基类的接口,当某个派生类的实现代码发生改变时,也不用重新编译所有用户代码。
相比较于Implement class 和Interface class ,inline 函数的优点暂且不提,其可造成的最大问题就是一旦inline函数发生变化,则所有调用inline 函数的代码都必须重新编译。
所以无论是Implement class 中的实现细节类中的函数,还是 interface class中的接口函数,一旦本身是inline 函数,或调用了inline函数,则一旦inline 函数发生改变,则所有引用到这些函数的代码都会发生改变,就是说要重新编译,而这样一来,Implement class 和 Interface class 所做的所有努力不都是白费了么?毕竟都是为了让实现代码与用户代码完全分离。
所以我查了下Effective c++ 的原文
Finally, neither Handle classes nor Interface classes can get much use out of inline functions.
由于使用了neither... nor... 的句型,所以正确翻译是:
最后,无论是Handle classes 还是 Interface classes,一旦使用了inline 函数,都不会有太大作为。