¿El siguiente estándar está conforme? ¿Puedes citar la sección?¿Una función virtual anula una función no virtual del mismo nombre en una clase base?
struct A
{
virtual void func() = 0;
};
struct B
{
void func(){}
};
struct C : public A, public B
{
virtual void func(){ B::func(); }
};
Estoy recibiendo una advertencia del compilador extraña en VS2010 en el código equivalente pero más complicado que apunta a la declaración func
's en la más derivado de la clase: warning C4505: unreferenced local function has been removed
. No tengo idea de por qué el compilador cree que una función virtual declarada en una clase es local; sin embargo, no puedo reproducir esa advertencia en un ejemplo más simple.
Editar:
me di cuenta de una pequeña caja repro por el aviso. Creo que estaba tomando el camino equivocado suponiendo que estaba relacionado con el ocultamiento de funciones. Aquí está el caso de repro:
template<typename T>
struct C
{
int GetType() const;
virtual int func() const; // {return 4;} // Doing this inline removes the warning <--------------
};
template<typename T>
int C<T>::GetType() const
{
return 0;
}
template<>
int C<int>::GetType() const
{
return 12;
}
template<typename T>
int C<T>::func() const
{
return 3;
}
// Adding the following removes the warning <--------------------
// template<>
// int C<int>::func() const
// {
// return 4;
// }
Estoy bastante seguro de que esto es solo un error VS2010.
"en código equivalente pero más complicado ... no se puede reproducir esa advertencia en un ejemplo más simple". Entonces probablemente no sean equivalentes. –
El código anterior no produce la advertencia de la que hablas en VS2010. No hay nada semánticamente mal con eso, pero la elección del diseño es extraña para mí. – AJG85
Todavía estoy tratando de encontrar la manera de reprogramar esa advertencia: voy a editar cuándo y si lo hago. – David