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()
}