/************************************************************************ *
The following example shows a class that inherits from two nonvirtual
bases that are derived from a virtual base class.
* ************************************************************************/
class V { public: virtual void f() { /* ... */ }; }; class A : virtual public V { void f() { /* ... */ }; }; class B : virtual public V { void f() { /* ... */ }; }; class D : public B, public A { /* ... */ }; // error void main () { D d; V* vptr = &d; vptr->f(); // which f(), A::f() or B::f()? }
/************************************************************************ *
In class A, only A::f() will override V::f(). Similarly, in
class B, only B::f() will override V::f(). However, in class D
, both A::f() and B::f() will try to override V::f(). This attempt is
not allowed because it is not possible to decide which function to call if a
D object is referenced with a pointer to class V, as shown in the above
example. Because only one function can override a virtual function, the
compiler flags this situation as an error.
* ************************************************************************/