Virtual inheritance imposes several restrictions. One of them is that you cannot use a class that has no default constructor as a virtual base class. Consider the following program:
struct A{ A(int n) {} // no default ctor};struct B: public virtual A // virtual inheritance{ B(): A(5) {}};struct C: public B{};int main(){ C c; //compilation error: "Cannot find default constructor //to initialize base class 'A'."}
Had we used plain inheritance instead of virtual inheritance, this program would compile without a hitch. Why does C++ mandate that a virtual base class have a default constructor? The problem is that only a single instance of a virtual base class exists in a hierarchy. If A served as a virtual base of several classes, each of which passing a different argument to A’s constructor, the compiler wouldn’t know which argument list to choose. This problem doesn’t exist with non-virtual base classes because there may be multiple instances of the base subobject in this case.