码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++ 34 区分接口继承和实现继承

时间:2014-09-11 09:33:21      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   io   使用   div   sp   cti   

public继承从根本上讲,有两部分:接口继承和实现继承。两者之前的区别很像函数声明与函数定义。

具体设计中,会呈现三种形式:derived class只继承成员函数的接口(纯虚函数);derived class同时继承函数的接口和实现,同时能够重写(override);derived class同时继承函数的接口和实现,但是不允许重写该函数。

 

1、只继承成员函数的接口(纯虚函数):

例如pure函数

2、同时继承函数的接口和实现,同时能够重写(override):

例如impure函数,为了避免用户不想使用默认实现,但同时忘记重写该函数的情况发生,书中给出一种很nice的解决方案:声明为纯虚函数,但是给定默认实现,如果想用父类的默认实现,需要显示调用,如果不想用默认声明,需要自己定义。

下面例子中的fly函数:

 1 class Airplane {
 2 public:
 3   virtual void fly(const Airport& destination) = 0;
 4   ...
 5 };
 6 void Airplane::fly(const Airport& destination)
 7 {
 8   飞机飞往某一目的地的缺省代码
 9 }
10 class ModelA: public Airplane {
11 public:
12   virtual void fly(const Airport& destination)
13   { Airplane::fly(destination); }
14   ...
15 };
16 class ModelB: public Airplane {
17 public:
18   virtual void fly(const Airport& destination)
19   { Airplane::fly(destination); }
20   ...
21 };
22 class ModelC: public Airplane {
23 public:
24   virtual void fly(const Airport& destination);
25   ...
26 };
27 void ModelC::fly(const Airport& destination)
28 {
29   ModelC飞往某一目的地的代码
30 }

 

3、同时继承函数的接口和实现,但是不允许重写该函数:

 例如non-virtual函数,这种实现方法强调不变性,即所有derived class 都应该继承base class的非虚函数,并应该遵循父类对该函数的实现方法。

 

Effective C++ 34 区分接口继承和实现继承

标签:des   style   blog   color   io   使用   div   sp   cti   

原文地址:http://www.cnblogs.com/bigbigtree/p/3965724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!