Herencia virtual: Error: no hay anulación final única

Sé que la herencia virtual está cubierta aquí antes y antes de hacer esta pregunta, revisé los detalles de la herencia virtual y revisé los detalles de un problema similar como los siguientes:

compilaciones-de-herencia-múltiples-diamantes-sin-virtual-pero-no-con y¿Por qué gcc me da un error?

Mi problema es ligeramente diferente, ya que no estoy usando la función virtual pura y explícitamente uso la herencia virtual para tener una clase 'Base' única. La jerarquía es la siguiente:

   Base
    /\
   /  \
 Der1 Der2
   \  /
   Der3

Sé sobre el terrible diamante en cuestión de derivación y es por eso que estoy usando herencia virtual.

#include <iostream>
class base
{
public :

    base()
    {
        std::cout<<"base()" << std::endl;
    }
    virtual void fun()
    {
        std::cout<<"base" << std::endl;
    }
};

class der1: virtual public base
{
public :
    void fun()
    {
        std::cout<<"der1" << std::endl;
    }
};

class der2 : virtual public base
{
public :
    void fun()
    {
        std::cout<<"der2" << std::endl;
    }
};

class der3 : public der1,public der2
{
    public :
    /*void fun()
    {
        std::cout<<"der3" << std::endl;
    }*/
    //if I took out the comment and the function 
    //is defined it compiles fine as expected
};

int main()
{
    base *p=new der3;
    //used scope operation explicitly to avoid ambiguity
    p->base::fun(); //here it complains about 'no unique final overrider for fun'
    return 0;
}

Entiendo que, como estoy usando la herencia virtual, solo debería haber una instancia de la 'base' y, usando el operador de alcance, puedo invocar sin ambigüedad la función de diversión virtual. La función no es puramente virtual. Si me voy y la implementación en la clase 'der3' me está dando un error de compilación:

error: no hay una anulación final única para base virtual void base :: fun () ’en 'der3'

Puedo ver cómo funciona este problema (anulación final) Pero el mío no. ¿Se está confundiendo entreBase::fun, der1::fun yder2::fun? ¿El operador de alcance ayuda de alguna manera?

Cualquier pista o ayuda es apreciada. Estoy usando g ++ 4.6.3.

Respuestas a la pregunta(2)

Su respuesta a la pregunta