Entorno de desarrollo: GNU GCC (g ++) 4.1.2
Mientras intento investigar cómo aumentar la 'cobertura de código, en particular la cobertura de funciones' en las pruebas unitarias, descubrí que parte de la clase dtor parece generarse varias veces. ¿Alguno de ustedes tiene alguna idea de por qué, por favor?
Intenté y observé lo que mencioné anteriormente usando el siguiente código.
En "test.h"
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
En "test.cpp"
#include <iostream>
#include "test.h"
BaseClass::~BaseClass()
{
std::cout << "BaseClass dtor invoked" << std::endl;
}
void BaseClass::someMethod()
{
std::cout << "Base class method" << std::endl;
}
DerivedClass::~DerivedClass()
{
std::cout << "DerivedClass dtor invoked" << std::endl;
}
void DerivedClass::someMethod()
{
std::cout << "Derived class method" << std::endl;
}
int main()
{
BaseClass* b_ptr = new BaseClass;
b_ptr->someMethod();
delete b_ptr;
}
Cuando construí el código anterior (g ++ test.cpp -o test) y luego veo qué tipo de símbolos se han generado de la siguiente manera,
nm - prueba de descomposición
Pude ver el siguiente resultado.
==== following is partial output ====
08048816 T DerivedClass::someMethod()
08048922 T DerivedClass::~DerivedClass()
080489aa T DerivedClass::~DerivedClass()
08048a32 T DerivedClass::~DerivedClass()
08048842 T BaseClass::someMethod()
0804886e T BaseClass::~BaseClass()
080488f6 T BaseClass::~BaseClass()
Mis preguntas son las siguientes:
1) ¿Por qué se han generado varios dtors (BaseClass - 2, DerivedClass - 3)?
2) ¿Cuáles son las diferencias entre estos dtores? ¿Cómo se utilizarán selectivamente esos múltiples dtores?
Ahora tengo la sensación de que para lograr una cobertura de funciones del 100% para el proyecto C ++, deberíamos entender esto para poder invocar todos esos dtors en mis pruebas unitarias.
Le agradecería mucho si alguien me pudiera dar la respuesta a lo anterior.