C++中基类初始化之向基类传递参数

C++中基类初始化之向基类传递参数

如果基类包含重载的构造函数,需要在实例化时给它提供实参,该如何办呢?创建派生对象时将如何实例化这样的基类?方法是使用初始化列表, 并通过派生类的构造函数调用合适的基类构造函数,如下面的代码所示:

class Base
{
    public:
    Base(int someNumber) // overloaded constructor
    {
        // Use someNumber
    }
};
Class Derived: public Base
{
    public:
    Derived(): Base(25) // instantiate Base with argument 25
    {
        // derived class constructor code
    }
};

对 Fish 类来说,这种机制很有用。通过给 Fish 的构造函数提供一个布尔输入参数,以初始化 Fish::isFreshWaterFish,可强制每个派生类都指出它是淡水鱼还是海水鱼,如以下示例程序所示:

#include 
using namespace std; 

class Fish
{
protected:
   bool isFreshWaterFish; // accessible only to derived classes

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) {}
};

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

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: Swims in lake
Dinner: Swims in sea

分析:
现在, Fish 有一个构造函数,它接受一个默认参数,用于初始化 Fish::isFreshWaterFish。因此,要创建 Fish 对象,必须提供一个用于初始化该保护成员的参数。这样, Fish 类便避免了保护成员包含随机值,尤其是派生类忘记设置它时。派生类 Tuna 和 Carp 被迫定义一个这样的构造函数,即使用合适的参数( true 或 false,表示是否是淡水鱼)来实例化基类 Fish,如第 24 和 30 行所示

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

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

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