C++中在派生类中覆盖基类的方法

C++中在派生类中覆盖基类的方法

如果派生类实现了从基类继承的函数,且返回值和特征标相同,就相当于覆盖了基类的这个方法,
如下面的代码所示:

class Base
{
    public:
    void DoSomething()
    {
        // implementation code… Does something
    }
};
class Derived:public Base
{
    public:
    void DoSomething()
    {
        // implementation code… Does something else
    }
};

因此,如果使用 Derived 类的实例调用方法 DoSomething( ),调用的将不是 Base 类中的这个方法。
如果 Tuna 和 Carp 类实现了自己的 Swim( )方法,则在程序清单 10.3 的 main( )中下述代码将调用 Tuna::Swim( )的实现,这相当于覆盖了基类 Fish 的方法 Swim( ):

36: Tuna myDinner;
// ...other lines
44: myDinner.Swim();

程序清单 10.4 演示了这一点。

#include 
using namespace std; 

class Fish
{
private:
   bool isFreshWaterFish;

public:
   // Fish constructor
   Fish(bool IsFreshWater) : isFreshWaterFish(IsFreshWater){}

   void Swim()
   {
      if (isFreshWaterFish)
         cout << "Swims in lake" << endl;
      else
         cout << "Swims in sea" << endl;
   }
};

class Tuna: public Fish
{
public:
   Tuna(): Fish(false) {}

   void Swim()
   {
      cout << "Tuna swims real fast" << endl;
   }
};

class Carp: public Fish
{
public:
   Carp(): Fish(true) {}

   void Swim()
   {
      cout << "Carp swims real slow" << endl;
   }
};

int main()
{
   Carp myLunch;
   Tuna myDinner;

   cout << "Getting my food to swim" << endl;

   cout << "Lunch: ";
   myLunch.Swim();

   cout << "Dinner: ";
   myDinner.Swim();

   return 0;
}

输出:

About my food
Lunch: Carp swims real slow
Dinner: Tuna swims real fast

分析:
输出表明,第 51 行的 myLunch.Swim( )调用的是第 37~40 行定义的 Carp::Swim( )。同样,第 54 行的 myDinner.Swim( )调用的是第 26~29 行定义的 Tuna::Swim( )。换句话说,基类 Fish 中 Swim( )的实现(第 12~18 行)被派生类 Tuna 和 Carp 类中的 Swim( )覆盖了。 要调用 Fish::Swim( ), 只能在 main( )中使用作用域解析运算符显式地调用它。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

你可能感兴趣的:(C++编程基础,c++)