Virtual inheritance

The code below defines a virtual base class VirtualBase and a derived class Derived which implements it. The VirtualBase interface is simply to set and get an integer value. The Derived adds a method for printing the value. We then have two functions in the global namespace, printTheValue1() and printTheValue2(), which print out the values in different ways: the first simply uses the get method of the interface to retrieve the value; the second tries to transform the VirtualBase interface pointer passed as argument to a pointer to the Derived class, and then calls the Derived class' print method.

// this program does not compile!
#include<iostream>

class VirtualBase {
public:
  virtual ~VirtualBase() { }
  virtual void setValue(int i) = 0;
  virtual int getValue(void) = 0;
};

class Derived : public virtual VirtualBase {
public: 
  ~Derived() { }
  void setValue(int i) { 
    theValue = i;
  }
  int getValue(void) {
    return theValue;
  }
  void printValue(void) {
    std::cout << "Derived::printValue(): value is " << theValue << std::endl;
  }
private:
  int theValue;
};

void printTheValue1(VirtualBase* v) {
  std::cout << "printTheValue1(): value is " << v->getValue() << std::endl;
}

void printTheValue2(VirtualBase* v) {
  Derived* d = v;
  d->printValue();
}

int main(int argc, char** argv) {
  int ret = 0;
  Derived d;
  VirtualBase* v = &d;
  v->setValue(1);
  printTheValue1(v);
  printTheValue2(v);
  return ret;
}  
  
The desired output is:
printTheValue1(): value is 1
Derived::printValue(): value is 1
However, the program fails to compile with the error:
virtual2.cxx: In function 'void printTheValue2(VirtualBase*)':
virtual2.cxx:31: error: invalid conversion from 'VirtualBase*' to 'Derived*'
virtual2.cxx:31: error: cannot convert from base 'VirtualBase' 
                 to derived type 'Derived' via virtual base 'VirtualBase'
What has gone wrong? How can you fix this program? [Hint: look at C++ casting operators]



Subsections

Leo Liberti 2008-01-12