Tuesday, December 11, 2007

Viral virtual inheritence


As I posted here, virtual inheritence in C++ is a pain. Today I realized that it is also viral.

Suppose the same inheritence as the last time and add a new class D inheriting from B1. As in the former case there was a diamond the inheritence between A and B1 is virtual. From D's point of view you have the following code:

class A { 
public:
    A(int i) { /* ... */ }
};

class B1 : public virtual A { 
public:
    B1() : A(0) { }
};

class D : public B1 {
public:
    D() : B1() { }
};

This is a normal inheritence scenario. D's constructor calls its parent constructor and this one calls the grand parent's constructor and everything is fine, right? No. this example does not compile. GCC says: "In constructor 'D::D()': error: no matching function for call to 'A::A()'".

Yeah, right, D must call its grand parent's constructor, because B1's inheritence from A is virtual. This means: once you decide to use a class as the top of a diamond this has consequences for all uses of this class. Args!

No comments:

Post a Comment