Disambiguation- Virtual Base Classes

A class derived from two classes that are based upon the same class, potentially giving rise to ambiguous statements, can be made unambiguous by using virtual base classes. In the program below both DerivedClass1 and DerivedClass2 derive from BaseClass:
class DerivedClass1: virtual public BaseClass{
// class members
};
class DerivedClass2: virtual public BaseClass{
// class members
};
In the code chunk below DerivedClass3 derives from DerivedClass1 and DerivedClass2:
class DerivedClass3: public DerivedClass1, public DerivedClass2
But in the class DerivedClass3 there is only one version of BaseClass, precisely because BaseClass is declared as virtual in both DerivedClass1 and DerivedClass2. This implies that BaseClass is "shared" between DerivedClass1 and DerivedClass2 and in DerivedClass3 there is only one version of BaseClass members available. For such a reason, the statement:
anObject.seta("hello");
can be included within the main(): there is only one version of seta().

Example


#include <iostream>
#include <string>

using namespace std;

class BaseClass
{
     string a;
public:
     void seta(string s)
     {
           a = s;
     }
};

class DerivedClass1: virtual public BaseClass
{
     string d1;
public:
     void setd1(string s)
     {
           d1 = s;
     }
};

class DerivedClass2: virtual public BaseClass 
{
     string d2;
public:
     void setd2(string s)
     {
           d2 = s;
     }
};

class DerivedClass3: public DerivedClass1, public DerivedClass2
{
     string d3;
public:
     void setd3(string s)
     {
           d3 = s;
     }
};

int main()
{
    DerivedClass3 anObject;
    anObject.seta("hello"); // unambiguous: there is only one seta()
}