cómo prevenir llamando a la función virtual en constructor o destructor?

StackOverflow https://stackoverflow.com/questions/4495640

  •  12-10-2019
  •  | 
  •  

Pregunta

Algunos materiales ++ C mencionar que no podemos llamar a una función virtual dentro de Héctor o dtor,

(
Lo siento, creo que es mejor el cambio a
Algunos materiales ++ C mencionan será mejor no llamar a una función virtual dentro de Héctor o dtor,

)

pero que podemos llamar de forma accidental. ¿Hay alguna manera de prevenir esto?

Por ejemplo:

# include < iostream >  
using namespace std;  

class CAT  
{  
public:  
    CAT(){ f();}  
    virtual void f(){cout<<"void CAT:f()"<<std::endl;}  
};  

class SMALLCAT :public CAT  
{  
public:  
    SMALLCAT():CAT()  
    {  
    }  
    void f(){cout<<"void SMALLCAT:f()"<<std::endl;}    
};    

int main()  
{  
    SMALLCAT sc;   

}  

salida:

void CAT::f()  //not we expected!!!

Gracias

No hay solución correcta

Otros consejos

Se necesita poner a estos materiales "C ++" al cubo de la basura.

Por supuesto que puede llamar a funciones virtuales desde el constructor o destructor. Y que van a hacer su trabajo. Usted sólo tendrá que estar al tanto de la especificación del lenguaje que establece claramente que el mecanismo de despacho virtual funciona de acuerdo con el actuales tipo dinámico del objeto, no con su final destinados tipo dinámico . Estos tipos no son los mismos para un objeto en construcción / destrucción, que a menudo confunde a los novatos cuando intentan invocar funciones virtuales de constructores / destructores. Sin embargo, llamar a funciones virtuales del constructor y el destructor es característica útil de la lengua, como siempre que se sepa lo que hacen y cómo funcionan en estos casos. ¿Por qué quieres para "prevenir" que?

Es como decir que el operador de división es peligroso ya que se puede dividir algo por cero, y pidiendo a la manera de "evitar" su uso en el programa.

Puede llamar a una función virtual dentro de un destructor. Sólo en algunos casos no va a funcionar, y puede bloquear el programa. La forma de evitar llamarlos es no llamarlos. No hay nada más elegante que conozco, aparte de, posiblemente, algunas herramientas de análisis estático para ver su código y advertirle de posibles problemas de este tipo.

Por supuesto que puede llamar a una función virtual dentro de una ctor / dtor. La cuestión es que su vtable se creó en cada constructor (y destructor), por lo que su llamada a la función virtual se llame a la implementación de la clase que se está creando actualmente. Si eso es lo que quiere, enfriar. Pero entonces es posible que así se ahorran las operaciones de búsqueda vtable y hacer una llamada de función con ámbito.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top