2010-02-09 18 views
6

Supongamos que tengo una situación herencia de diamante de la siguiente manera:¿Por qué la siguiente clase tiene una tabla virtual?

class A{ 
    public: virtual void foo(){}; 
}; 
class B: public virtual A{ 
    public: virtual void foo(){}; 
}; 
class C: public virtual A{ 
    public: virtual void foo(){}; 
}; 
class D: B, C{}; 

La última línea se obtiene un error de compilación citando ambigüedad. Según tengo entendido, el problema es que el compilador no sabe qué fuente colocar en D'vtbl, pero ¿por qué habría incluso una vblbl para D si no define ninguna función virtual propia?

+0

¿Es "virtual" como un especificador de nivel de protección incluso válido en las líneas de declaración de clase (por ejemplo, clase B: A virtual)? – Joe

+4

No es un especificador de protección. Denota una clase base virtual, que es una especie de truco legal para evitar el problema del diamante. –

+0

Ah, bien, gracias. – Joe

Respuesta

7

Estás heredando clases que contienen funciones virtuales. Por lo tanto, tu clase tiene funciones virtuales. Es tan simple como eso.

+0

Entonces tal vez me falta algo, porque cuando elimino la palabra "virtual" de la especificación de herencia (clase B: A, clase C: A), se compila y se ejecuta. ¿No debería el problema continuar porque estoy "heredando clases que contienen funciones virtuales"? – EpsilonVector

+0

Disculpe que fue clase B: A pública, y así sucesivamente ... – EpsilonVector

+0

Elimine la palabra clave 'virtual' de las declaraciones de métodos en' clase B' y 'clase C'. Vuelva a compilar y vea qué pasa. –

Cuestiones relacionadas