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的非虚函数,并应该遵循父类对该函数的实现方法。
时间: 2024-10-17 22:52:23