class Abstract { public: virtual void f() = 0; }; class LeftDerived : public virtual Abstract { // bug disappears if not virtual public: virtual void f(); }; class RightDerived : public virtual Abstract { // bug disappears if not virtual public: virtual void f(); }; class Confluence : public LeftDerived, public RightDerived { // bug disappears if not multiple inheritance public: virtual void f(); }; int main() { Confluence c; return 0; } void LeftDerived::f() {} void RightDerived::f() {} void Confluence::f() {}