Me parece extraño. En el ctor de Sample_Base, invoco bar() que internamente llama a fun(), que es una función virtual pura. Me sale el error llamado "función virtual pura". Lo cual está bien. Ahora, si invoco fun() directamente desde el ctor de Sample_Base, no obtengo ese error. Lo probé en VC++ 2010 Beta 2 y en g ++ 4.4.1 en Ubuntu 9.10. Estoy de acuerdo en que dar una implementación para la función virtual pura, que no sea el destructor virtual puro, no tiene sentido. Pero, estoy un poco sorprendido acerca de este comportamiento.Función virtual pura llamada error
class Sample_Base
{
public:
Sample_Base()
{
bar();
// fun();
}
/* This is code does not throw any error.
Sample_Base()
{
fun();
}
*/
void bar()
{
fun();
}
virtual void fun() = 0;
virtual ~Sample_Base();
};
Sample_Base::~Sample_Base()
{
}
void Sample_Base::fun()
{
std::cout << "Sample_Base::fun\n";
}
class Sample_Derived : public Sample_Base
{
public:
Sample_Derived() : Sample_Base()
{
fun();
}
void fun()
{
std::cout << "Sample_Derived::fun\n";
}
~Sample_Derived()
{
}
};
El [Estándar de C++] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) §10.4.6 establece que "una llamada virtual a una función virtual pura" ... para el objeto que se está creando ... no está definido ". ¿Puedes comentar sobre eso? Lo leería diciendo que llamar 'fun' directamente también debería estar indefinido (incluso si el compilador no produce un programa bloqueado en este caso específico). O no es una llamada virtual en ese contexto (si es así, por qué, no pude encontrarlo en el estándar). – Xlea
@ Xlea Charles Bailey lo dirige a las secciones correctas del estándar en su respuesta. Eso sí, estaba usando el estándar C++ 03 en ese entonces, por lo que los números de las secciones serán diferentes ahora, pero eso puede guiarte. – Gorpik