virtuales sirve que puro puras polimorfismo para operadores new herencia funciones delete c++ inheritance virtual overhead

c++ - sirve - polimorfismo java



Sobrecarga de la herencia C++ sin funciones virtuales. (5)

En realidad no, solo aumentó la memoria por la clase base. Puedes leer más here en C ++ FAQ

En C ++, ¿cuál es la sobrecarga (memoria / cpu) asociada con la herencia de una clase base que no tiene funciones virtuales? ¿Es tan bueno como una copia recta + pegar de los miembros de la clase?

class a { public: void get(); protected: int _px; } class b : public a { }

comparado con

class a { public: void get(); protected: int _px; } class b { public: void get(); protected: int _px; }


La compilación tardará un poco más de tiempo, y no habrá sobrecarga adicional en tiempo de ejecución. Desde la perspectiva del optimizador, los métodos no virtuales son lo mismo que los procedimientos: se los puede llamar usando solo su dirección de memoria, sin sobrecargas de una tabla de métodos virtuales.


Puede haber una pequeña sobrecarga de memoria (debido al relleno) al usar la herencia en comparación con la copia y el pasado, considere las siguientes definiciones de clase:

struct A { int i; char c1; }; struct B1 : A { char c2; }; struct B2 { int i; char c1; char c2; };

sizeof (B1) probablemente será 12, mientras que sizeof (B2) podría ser 8. Esto se debe a que la clase base A se rellena por separado a 8 bytes y luego B1 se rellena nuevamente a 12 bytes.


Si olvida la herencia virtual, tener una clase base es equivalente, memoria y rendimiento, a tener un miembro de la misma clase. Excepto que a veces puede ser incluso mejor (por ejemplo, una clase vacía tiene un tamaño de al menos uno, pero tener una clase base vacía a menudo puede no tener sobrecarga).


Si puede tener un puntero de tipo Base * que apunta a un objeto de tipo Derivado *, probablemente necesite un destructor virtual y su premisa original ya no se aplique. Si la clase derivada tiene un destructor vacío y no tiene miembros o son todos los tipos de POD, puede escapar sin un destructor virtual, pero generalmente es mejor jugar de forma segura y hacerlo virtual desde el principio.

El compilador generará una llamada directa al código que implementa cada función miembro no virtual, por lo que no hay sobrecarga.