upcasting

The classes ADC and MCA are derived from Detector which is derived from Device. Upcasting occurs in this line det = &adc, which allows the ADC to be treated as a Detector and upcasting occurs also by the function display( Detector *det) which is later fed by an ADC and a MCA. This is possible because both are detectors.

//
// g++ upcasting.cpp
//
#include <iostream>
using namespace std;

class Device
{
public:
  Device( string name)
  {
    Name = name;
  }
  string Name; 
};

class Detector:public Device
{
public:
  Detector(string name, string nDim) : Device( name)
	{
	  NDim = nDim;
	}
  string NDim;
  void show()
	{
      cout << Name << " is a " << NDim << " device" << endl;
	}
};

class ADC :public Detector
{
public:
  ADC(string name, string nDim, double offset) : Detector( name, nDim)
  {
    Offset = offset;
  }
  double Offset;
  double getOffset()
  {
    return Offset;
  }
};

class MCA :public Detector
{
public:
  MCA(string name, string nDim, int channels) : Detector( name, nDim)
	{
      Channels = channels;
	}
  int Channels;
  int getChannels()
	{
      return Channels;
	}
};

void display( Detector* det)
{
	cout << "Display a detector" << endl;
	det->show();
};

int main()
{
  Detector* det;
    
  // objects derived from Detector
  ADC adc( "adc1", "0D", 123);
  MCA mca( "mca1", "1D", 1024);
    
  // upcasting
  det = &adc;
  
  // the base class has Name and NDim
  cout << det->Name << " nDim " << det->NDim << endl;
    
  // Fails because Detector has no getChannels()
  // cout<< det->getChannels();
  
  display( &adc);
  display( &mca);
}