<<Effective C++>>
条款34: 区分接口继承和实现继承
抽象类(abstract class)和接口(interface)的概念是面向对象设计中常用的概念, 也是比较容易混淆的概念:
-
如果一个类B在语法上继承(extend)了类A, 那么在语义上类B是一个类A.
-
如果一个类B在语法上实现了(implement)接口I, 那么类B遵从接口I制定的协议.
-
抽象
使用abstract class的根本原因在于, 人们希望通过这样的方式, 表现不同层次的抽象. -
接口
而interface的本质是一套协议. 在程序设计的发展中, 人们又发现接口可以用来表示对行为的抽象, 不过, 这只是interface的一种用法不是其本质.
不包含成员函数
接口类中不包含成员函数
不能Delete接口
因为接口是一套协议, 一套规范, 并不是实现。 删除一个接口实力并没有
class IInterface()
{
Public: Virtual ~IInterface(){};
…
}
Class ClassImpl : public IInterface
{
…
}
Int main()
{
IInterface* pInterface = new ClassImpl();
…
delete pInterface;
}
C++接口的表现
class Shpage
{
public:
virtual void draw() const = 0; //pure vistual
virtual void error(const std::string &msg); //impure visual
void objectID() const; //none visual
...
};
- 声明一个纯虚函数(pure visual)的目的就是为了让派生类只继承函数接口,即接口继承。
- 声明一个非纯虚函数(impure visual)的目的是为了让派生类继承函数接口和缺省实现。
- 声明一个非虚函数(non visual)的目的是为了让派生类继承函数接口和一份强制实现。