Multiple (diamond) inheritance compiles without "virtual", but doesn't with
c++, multiple-inheritance, overriding, virtual, virtual-inheritance
Solution
Your first scenario hierarchy corresponds to:
F() F()
A A
| |
F() B C F()
\ /
D
Where D is not abstract, because there are two A subobjects in an object of type D: One that is made concrete by B through the lattice of B, and another that is made concrete through the lattice of C.
Unless you try to invoke the function F() on object of D there will not be any ambiguity.
Your second scenario hierarchy corresponds to:
F()
A
/ \
F() B C F()
\ /
D
In this scenario, the object D has a single Base class A sub object, and it must override and provide implementation of the pure virtual function in that subobject.
Herb Sutter's articles in Guru Of The Week(GOTW) are a nice read for Multiple Inheritance:
- Multiple Inheritance Part I
- Multiple Inheritance Part II
- Multiple Inheritance Part III
Problem
Given the following code (without virtual inheritance) : ``` class A { public: virtual void f() = 0; }; class B : public A { public: virtual void f() {} }; class C : public A { public: virtual void f() {} }; class D : public B, public C { /* some code */ }; int main() { D d; return 0; } ``` the code compile. On the other hand , here : ``` class A { public: virtual void f() = 0; }; class B : virtual public A { virtual void f() {} }; class C : virtual public A { virtual void f() {} }; class D : public B, public C { /* some code */ }; int main() { D d; return 0; } ``` The compiler presents a compilation error: ``` no unique final overrider for 'virtual void A::f()' in 'D' . ``` Why is it different in the second code ?