一个类是由函数 和 数据 组成的, 而函数 又可以分为 接口函数 和 实现函数(尽量不要在一个函数里完成接口和实现的功能),所以 当 类被继承时可以分为 函数接口继承 (function interfaces derived ) 和 函数实现继承 (function implementaion derived).,前者 是只继承 声明 ,后者则 可能覆写(override) 它们,为了体现上述两种继承的差异,我用C++ effective 中的shape例子来说明:
class
这里声明了一个pure virtual 的draw函数,所以下任何需要 能够实体化的 derived 类中都需要定义一个 自己的draw 版本 ,
但令人意外的是 我们可以为 pure virtual 函数提供定义 ,调用方法是明确指出其class名称 ,如 :
void Rectangle::draw()
{
Shape::draw();
}
但一般不要为pure virtual 函数写一个定义式,因为pure virtual 函数本来就是为了只让derived类继承接口而已。
//注释:虚函数使用 虚函数使用了迟绑定技术,即在该函数被基类对象指针调用时 会调用 到该derived类本身的函数
class
class Shape {
public:
virtual void draw( ) const = 0;//画出当前对象
virtual void error( const std::string& msg);//让那些报道错误的成员函数调用
int objectID( ) const;// 返回当前对象的一个独一无二的整数识别码
...
};
class Rectangle : public Shape{ ... };
class Ellipse : pulbic Shape { ... };
首先 这 两种继承都是 public 继承 即is-a 关系 ,因此某个函数可以对Base类使用也一定可以对derived 类使用,
这里声明了一个pure virtual 的draw函数,所以下任何需要 能够实体化的 derived 类中都需要定义一个 自己的draw 版本 ,
但令人意外的是 我们可以为 pure virtual 函数提供定义 ,调用方法是明确指出其class名称 ,如 :
void Rectangle::draw()
{
Shape::draw();
}
但一般不要为pure virtual 函数写一个定义式,因为pure virtual 函数本来就是为了只让derived类继承接口而已。
//注释:虚函数使用 虚函数使用了迟绑定技术,即在该函数被基类对象指针调用时 会调用 到该derived类本身的函数