Consideraciones virtuales en c ++

Es necesario tener en cuenta algunas cosas cuando se utilizan las funciones virtuales en C ++. En primer lugar, métodos estáticos no pueden ser declarados virtual. Dado que las funciones miembro estáticas no son llamados con un objeto, no hay ningún objeto en tiempo de ejecución en la que basar una decisión vinculante.

Video: Curso de C++ // Cap. 24 // [POO] Polimorfismo: funciones virtuales [+ otro operador]. [HD]

En segundo lugar, especificando el nombre de la clase en la llamada fuerza una llamada a unir temprano, si es o no la función es virtual. Por ejemplo, la siguiente llamada es de Base :: fn () porque eso es lo que el programador indica, incluso si fn () se declara virtual:

prueba de vacío (Base& b) {b.Base :: fn () - // esta llamada no está vinculado a finales}

Por último, los constructores no puede ser virtual porque no hay ningún objeto (completo) a utilizar para determinar el tipo. En el momento se llama al constructor, la memoria que ocupa el objeto es simplemente una masa amorfa. Es sólo después de que el constructor ha terminado de que el objeto es un miembro de la clase en buen estado.

En comparación, el destructor casi siempre debe ser declarada virtual. Si no, se corre el riesgo de autodestrucción inadecuada del objeto, como en la siguiente circunstancia:

Clase base {public: ~ Base () -} - clase subclase: Base pública {public: ~ subclase () -} - finishWithObject vacío (Base * pHeapObject) {// ... trabajar con objetos ... // Ahora regresa al heapdelete pHeapObject- // esto exige ~ Base () sin importar el tipo} // // tiempo de ejecución de pHeapObject

Si el puntero pasa al finishWithObject () Realmente apunta a una subclase, el subclase destructor no se invoca correctamente - porque el destructor no se ha declarado virtual, que siempre ha obligado temprano. Declarando el destructor virtual resuelve el problema.

Video: Curso de C++ -37- POO. Métodos virtuales

Así que cuando usted no quiere declarar el destructor virtual? Sólo hay un caso. funciones virtuales introducen un “pequeño” gastos generales.

Más específicamente: Cuando el programador define la primera función virtual en una clase, C ++ añade un puntero adicional, oculto - no por un puntero de función virtual, sólo un puntero si la clase tiene ninguna función virtuales. Una clase que no tiene funciones virtuales (y no hereda las funciones virtuales de clases base) no tiene este puntero.

Ahora, un puntero no se parece mucho, y no es menos que se cumplen las dos condiciones siguientes:

  • La clase no tiene muchos miembros de datos (de modo que un puntero representa mucho en comparación con lo que hay ya).

  • Tiene la intención de crear una gran cantidad de objetos de esta clase (de lo contrario, la sobrecarga no hace ninguna diferencia).

Video: C++ Virtual Destructors

Si se cumplen estas dos condiciones y la clase aún no tiene funciones miembro virtuales, puede que no quiera declarar el destructor virtual.

A excepción de este único caso, siempre declarar destructores a ser virtual, incluso si una clase no es una subclase (todavía) - nunca se sabe cuando alguien va a llegar y usar su clase como la clase base para su propio. Si no se declara el destructor virtual, a continuación, declarar la clase final (si su compilador soporta esta función) y documentarla!

Artículos Relacionados