C++中的接口继承和实现继承

C++中的继承基于一个事实:父类定义的成员函数会一直被子类继承(包括被子类隐藏的部分)。

而父类中提供的函数可以有三种: 1)纯虚函数,2)普通虚函数 ,3)普通成员函数。这三种函数类型代表了三种继承设计模式。

一个简单的实例代码如下:

class Shape {
public:
  virtual void draw() const = 0;
  virtual void error(const string& msg);
  int objectID() const;
  ...
};
class Rectangle: public Shape { ... };
class Ellipse: public Shape { ... };

纯虚函数draw使得Shape成为一个抽象类。所以,用户不能创建Shape类的实例,只能创建它的派生类的实例。

Shape类中声明了三个函数。第一个函数draw,在某一画面上绘制当前对象。第二个函数error,被其它成员函数调用,用于报告出错信息。第三个函数objectID,返回当前对象的一个唯一整数标识符。每个函数以不同的方式声明:draw是一个纯虚函数;error是一个简单的(非纯)虚函数;objectID是一个非虚函数。这些不同的声明各有什么含义呢?

1、纯虚函数

首先看纯虚函数draw。纯虚函数最显著的特征是:它们必须在继承了它们的任何具体类中重新声明,而且它们在抽象类中往往没有定义。从而可知:定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。!!!

这对Shape::draw函数来说非常有意义,因为,让所有Shape对象都可以被绘制是很合理,但Shape类无法为Shape::draw提供一个合理的缺省实现。例如,绘制椭园的算法就和绘制矩形的算法大不一样。打个比方来说,上面Shape::draw的声明就象是在告诉子类的设计者,“你必须提供一个draw函数,但我不知道你会怎样实现它。”

2、简单虚函数

简单虚函数的情况和纯虚函数有点不一样。照例,派生类继承了函数的接口,但简单虚函数一般还提供了实现,派生类可以选择改写它们或不改写它们。!!!

声明简单虚函数的目的在于,使派生类继承函数的接口和缺省实现。!!!

具体到Shape::error,这个接口是在说,每个类必须提供一个出错时可以被调用的函数,但每个类可以按它们认为合适的任何方式处理错误。如果某个类不想做什么特别的事,可以借助于Shape类中提供的缺省出错处理函数。也就是说,Shape::error的声明是在告诉子类的设计者,“你必须支持error函数,但如果你不想写自己的版本,可以借助Shape类中的缺省版本。”

3、非虚函数

最后,来谈谈Shape的非虚函数(普通成员函数),objectID。当一个成员函数为非虚函数时,它在派生类中的行为就不应该不同。实际上,非虚成员函数表明了一种特殊性上的不变性,因为它表示的是不会改变的行为 —- 不管一个派生类有多特殊。所以:

声明非虚函数的目的在于,使派生类继承函数的接口和强制性实现。!!!

也即是,非虚函数由父类声明且实现,子类应继承接口以及强制性的实现。

可以认为,Shape::objectID的声明就是在说,”每个Shape对象有一个函数用来产生对象的标识符,并且对象标识符的产生方式总是一样的。这种方式由Shape::objectID的定义决定,派生类不能改变它。” 因为非虚函数表示一种特殊性上的不变性,所以它决不能在子类中重新定义。

理解了纯虚函数、简单虚函数和非虚函数在声明上的区别,就可以精确地指定你想让派生类继承什么:仅仅是接口,还是接口和一个缺省实现?或者,接口和一个强制实现?

4、总结

纯虚函数代表的就是接口继承。其他两种代表实现继承

(1)纯虚函数:要求继承类必须含有某个接口,并对接口函数实现。
(2)虚函数:继承类必须含有某个接口,可以自己实现,也可以不实现,而采用基类定义的缺省实现。
(3)非虚函数:继承类必须含有某个接口,必须使用基类的实现。

http://blog.csdn.net/thimin/article/details/1538010

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值