Herança virtual: Erro: nenhuma substituição final exclusiva
Eu sei que a herança virtual é abordada aqui antes e antes de fazer essa pergunta, examinei os detalhes da herança virtual e os detalhes de um problema semelhante, como os seguintes:
A herança múltipla de diamantes compila sem virtual, mas não com epor que o gcc me deu um erro - final overrider
Meu problema é um pouco diferente, pois não estou usando função virtual pura e explicitamente usando herança virtual para ter uma classe 'Base' exclusiva. A hierarquia é a seguinte:
Base
/\
/ \
Der1 Der2
\ /
Der3
Eu sei sobre o terrível diamante na questão da derivação e é por isso que estou usando herança 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;
}
Meu entendimento é que, como estou usando herança virtual, deve haver apenas uma instância da 'base' e, usando o operador de escopo, posso invocar sem ambiguidade a função de diversão virtual. A função não é virtual pura. Se eu sair e implementar na classe 'der3', ele está me dando um erro de compilador:
erro: nenhuma substituição final exclusiva para 'base de vácuo virtual :: fun ()' no 'der3'
Eu posso ver como esse problema funciona (overrider final) Mas o meu não. Está ficando confuso entreBase::fun
, der1::fun
eder2::fun
? O operador do escopo ajuda de qualquer maneira?
Qualquer pista ou ajuda é apreciada. Estou usando o g ++ 4.6.3.