C++ virtual function with Default parameter values

Description

C++ virtual function with Default parameter values

#include  <string>
#include  <iostream>

class Pool/*www .  j  a  v  a2 s.c  o  m*/
{
protected:
  double length {1.0};
  double width {1.0};
  double height {1.0};

public:
  Pool(double lv, double wv, double hv) : length {lv}, width {wv}, height {hv} {}

  // Function  to  show  the  volume of  an object
  void showVolume() const
  {
    std::cout << "Pool usable volume is " << volume() << std::endl;
  }

  // Function  to  calculate the  volume of  a Pool object
  virtual double volume(int i=5)  const
  {
    std::cout << "Pool parameter = " << i << std::endl;
    return length*width*height;
  }
};
using  std::string;

class  Carton : public Pool
{
private:
  string material;

public:
  // Constructor  explicitly calling the  base constructor
  Carton(double lv, double wv, double hv, string str = "material") : Pool {lv, wv, hv}
  {
    material = str;
  }

  // Function  to  calculate the  volume of  a Carton object
  double volume(int i = 50) const override
  {
    std::cout << "Carton parameter = " << i << std::endl;
    double vol {(length - 0.5)*(width - 0.5)*(height - 0.5)};
    return vol > 0.0 ? vol : 0.0;
  }
};

class  ToughPack : public Pool{
public:
  // Constructor
  ToughPack(double lv, double wv, double hv) : Pool {lv, wv, hv} {}

  // Function  to  calculate volume of  a ToughPack  allowing 15%  for  packing
  double volume(int i = 500) const override
  {
    std::cout << "ToughPack parameter = " << i << std::endl;
    return 0.85*length*width*height;
  }
};

int main(){
  Pool pool {20.0, 30.0, 40.0};
  ToughPack hardcase {20.0, 30.0, 40.0};         // A derived  pool - same size
  Carton carton {20.0, 30.0, 40.0, "plastic"};   // A  different derived pool

  pool.showVolume();                              // Volume of Pool
  hardcase.showVolume();                         // Volume of ToughPack
  carton.showVolume();                           // Volume of Carton
  std::cout << "hardcase volume is " << hardcase.volume() << std::endl;

  // Now  using a base pointer...
  Pool* pPool {&pool};                              // Points to type Pool
  std::cout << "\npool volume through pPool is " << pPool->volume() << std::endl;
  pPool->showVolume();

  pPool = &hardcase;                             // Points to type ToughPack
  std::cout << "hardcase volume through pPool is " << pPool->volume() << std::endl;
  pPool->showVolume();

  pPool = &carton;                              // Points to  type Carton
  std::cout << "carton volume through pPool is " << pPool->volume() << std::endl;
  pPool->showVolume();
}



PreviousNext

Related