problema con virtuales puras

03/09/2003 - 17:15 por Manuel D. Jiménez | Informe spam
Hola,

Hoy, nuestra duda es de C++. Voy al grano:

class CParent {
public:
void Run ();
private:
virtual void _ConcreteRun () = 0; // virtual pura
};

void CParent::Run ()
{
// some code...

_ConcreteRun();
}

class CChild : public CParent {
private:
void _ConcreteRun ();
};

void CChild::_ConcreteRun()
{
// some code...
}

Si hacemos:

CChild myChild;
myChild.Run();

Esté método run produce una excepción porque llama a la función _ConcreteRun
de CParent, que es virtual pura (por lo tanto, no existe).

¿Qué estamos haciendo mal? ¿Cómo hacemos para que se llame a
CChild::_ConcreteRun ?
 

Leer las respuestas

#1 Manuel D. Jiménez
03/09/2003 - 18:07 | Informe spam
Ya lo hemos descubierto:

Tenemos un constructor...

CParent::CParent(LPCTSTR str)
{
Run(str);
}

void CParent::Run(LPCTSTR str)
{
_ConcreteRun(str);
}

... y...

CChild::CChild(LPCTSTR str) : CParent(str)
{
}



Después tenemos el código:

std::string str;
CChild myChild;

myChild = str.c_str();

Esta línea debería darnos error de compilación, porque no hemos sobrecargado
el operador =. Sin embargo, el compilador se lo traga, y lo que hace es
llamar al constructor de CParent con str.c_str() como parámetro, lo cual
termina llamando a la versión virtual pura (!!!) de _ConcreteRun().

En fin, el error está solucionado, pero si alguien no lo sigue viendo
extraño que nos lo diga.

Gracias.


"Manuel D. Jiménez" escribió en el mensaje
news:
Hola,

Hoy, nuestra duda es de C++. Voy al grano:

class CParent {
public:
void Run ();
private:
virtual void _ConcreteRun () = 0; // virtual pura
};

void CParent::Run ()
{
// some code...

_ConcreteRun();
}

class CChild : public CParent {
private:
void _ConcreteRun ();
};

void CChild::_ConcreteRun()
{
// some code...
}

Si hacemos:

CChild myChild;
myChild.Run();

Esté método run produce una excepción porque llama a la función


_ConcreteRun
de CParent, que es virtual pura (por lo tanto, no existe).

¿Qué estamos haciendo mal? ¿Cómo hacemos para que se llame a
CChild::_ConcreteRun ?

Preguntas similares