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?
¿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
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. –
Ah, bien, gracias. – Joe