在普通的public继承中,实际上也分为接口以及实现继承。首先看下面这个例子:
1 class Shape{ 2 public: 3 virtual void draw() const = 0; 4 virtual void error(const std::string & msg); 5 int ObjectId() const; 6 }; 7 class Recantagle : public Shape{ 8 ... 9 }; 10 class Ellipse : public Shape{ 11 ... 12 };
1 class Ariport{ 2 ... 3 }; 4 class Airplane{ 5 public: 6 virtual void fly(const Ariport & dest); 7 ... 8 }; 9 class ModelA : public Airplane{ 10 ... 11 };
这里可能会忘了做ModelA的相应的fly实现从而使用了可能不希望使用的基类版本,这可以通过另一种方式来解决这种问题。
1 class Airplane{ 2 public: 3 virtual void fly(const Airplane & dest) = 0; 4 ... 5 protected: 6 void defaultFly(const Airplanes & dest); 7 }; 8 class ModelA : public Airplane{ 9 public: 10 virtual void fly(const Airplane & dest) 11 {defaultFly(dest);} 12 ... 13 }; 14 class ModelB : public Airplane{ 15 public: 16 virtual void fly(const Airplane & dest) 17 {//单独为自己机型定义的fly函数} 18 ... 19 };
1 class Airplane{ 2 public: 3 virtual void fly(const Airplane & dest) = 0 4 { 5 ....//自定义的实现 6 } 7 ... 8 }; 9 class ModelA : public Airplane{ 10 public: 11 virtual void fly(const Airplane & dest) 12 {Airplane::fly(dest);} 13 ... 14 }; 15 class ModelB : public Airplane{ 16 public: 17 virtual void fly(const Airplane & dest) 18 {//自定义的fly行为} 19 ... 20 };
原文:http://www.cnblogs.com/-wang-cheng/p/4889769.html