Driver1.C 1/8

[
top][prev][next]
// Uses pure virual functions to call appropriate method

#include "Frogosaur.H"
#include "Animal.H"
#include "Dinosaur.H"

const int N = 5;

int main () {

   Animal* animalPtrs[N];
   
   animalPtrs[0] = new Frog();
   animalPtrs[1] = new Dinosaur();
   animalPtrs[2] = new Frog();
   animalPtrs[3] = new Dinosaur();
   animalPtrs[4] = new Dinosaur();

   for(int i = 0; i < N; i++ ) {
      cout << "animalPtrs[" << i << "]: ";
      animalPtrs[i] -> talk();
   }
   
   return EXIT_SUCCESS;
}

Driver2.C 2/8

[
top][prev][next]
// Demonstrates multiple inheritance

#include "Frogosaur.H"
#include "Animal.H"
#include "Dinosaur.H"

int main () {

   Frogosaur frogosaur = Frogosaur();

   frogosaur.swim();     // from Frog base class
   frogosaur.walk();     // from Dinosaur base class
   
   return EXIT_SUCCESS;
}

Driver3.C 3/8

[
top][prev][next]
// Demonstrates diamond-problem in multiple inheritance 
// DOES NOT COMPILE

#include "Frogosaur.H"
#include "Animal.H"
#include "Dinosaur.H"

int main () {

   Frogosaur frogosaur = Frogosaur();

   frogosaur.swim();     // from Frog base class
   frogosaur.walk();     // from Dinosaur base class
   
   frogosaur.talk();     // uh-oh, talk is defined in both Frog
                         // and Dinosaur, which one do we want?
   
   return EXIT_SUCCESS;
}

Driver4.C 4/8

[
top][prev][next]
// Demonstrates use of scope resolution operator to
// overcome diamond problem in multiple inheritance 

#include "Frogosaur.H"
#include "Animal.H"
#include "Dinosaur.H"

int main () {

   Frogosaur frogosaur = Frogosaur();

   frogosaur.swim();               // from Frog base class
   frogosaur.walk();               // from Dinosaur base class
      
   frogosaur.Dinosaur::talk();     // specifically the Dinosaur's talk method
   
   return EXIT_SUCCESS;
}

Animal.H 5/8

[
top][prev][next]
#ifndef _ANIMAL_H_
#define _ANIMAL_H_

using namespace std;

// virtual base class - can not instantiate
class Animal {
   public:
      virtual void talk() = 0;     // pure virtual
};

#endif

Dinosaur.H 6/8

[
top][prev][next]
#ifndef _DINOSAUR_H_
#define _DINOSAUR_H_

#include <iostream>
#include "Animal.H"

using namespace std;

// extends the animal class
class Dinosaur : public Animal {
   public:
      void talk() { cout << "Oh I'm a dinosaur and I'm OK..." << endl; }
      void walk() { cout << "Walk, Walk." << endl; }
};

#endif

Frog.H 7/8

[
top][prev][next]
#ifndef _FROG_H_
#define _FROG_H_

#include <iostream>
#include "Animal.H"

using namespace std;

// extends the animal class
class Frog : public Animal {
   public:
      void talk() { cout << "Ribit, ribit." << endl; }
      void swim() { cout << "Splash, splash." << endl; }
};

#endif

Frogosaur.H 8/8

[
top][prev][next]
#ifndef _FROGOSAUR_H_
#define _FROGOSAUR_H_

#include "Frog.H"
#include "Dinosaur.H"

class Frogosaur : public Frog, public Dinosaur {

      // nothing additional 
      
};

#endif

Generated by GNU enscript 1.6.1.