que - Eliminando funciones virtuales en C++ 0x
que es un objeto en c++ (2)
No está claro qué sucede si elimino un método virtual en C ++ 0x:
virtual int derive_func() = delete;
¿Esto significa que esta clase y todo lo que se hereda de ella no puede definir / implementar el método derive_func()
? ¿O es esto un error ilegal / de compilación?
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2326.html#delete A deleted virtual function may not override a non-deleted virtual function and vice-versa.
lo que significa que es bastante inútil (cuando lo leo al menos) el único uso válido sería:
struct A{
virtual void b() = delete;
};
struct B:A{
virtual void b() = delete;
};
que es completamente inútil, ya que la función nunca puede ser llamada. Para funciones no virtuales el uso está más justificado.
EDITAR para que quede completamente claro, esta es la ÚNICA relación posible, es posible que los niños no se implementen y no puede eliminar un virtual heredado no eliminado.
flownt lo hizo bien , pero quiero señalar que en el borrador final de C ++ 11 (N3337), el lenguaje correspondiente se ha movido a la sección 10.3 # 16:
Una función con una definición eliminada no anulará una función que no tenga una definición eliminada. Del mismo modo, una función que no tenga una definición eliminada no deberá anular una función con una definición eliminada. 2
Me parece bastante claro (sección 8.4.3 # 1) que una definición eliminada en realidad cuenta como una definición , y de hecho una definición en línea, lo que significa que una definición eliminada cumple con 10.3 # 11:
Una función virtual declarada en una clase se definirá, o se declarará pura en esa clase, o en ambas; pero no se requiere ningún diagnóstico. 2
Sin embargo, parece que las implementaciones actuales no están de acuerdo. Aquí está mi caso de prueba:
struct Base {
virtual void bar();
virtual void foo() = delete;
};
void Base::bar() { } // a definition of the first non-inline virtual function
int main() { Base b; }
Clang produce un programa que no se puede vincular:
Base::foo
se menciona en el vtable paraBase
. Y si cambias el orden defoo
ybar
, el enlazador se queja de que falta todo el vtable (porque Clang cree quefoo
es una función en línea sin definición). Archivé esto como un error ; Veremos qué piensan los desarrolladores.GCC se queja de un "uso" de
foo
al final de la unidad de traducción, cuando crea el vtable; pero identifica correctamente labar
como la primera función miembro virtual no en línea, sin importar el orden defoo
ybar
.