entorno de desarrollo: GNU GCC (g ++) 4.1.2GNU GCC (g ++): ¿Por qué genera múltiples dtors?
Mientras que estoy tratando de investigar cómo aumentar 'la cobertura de código - en especial la cobertura función' en la unidad de pruebas, he encontrado que algunos de dtor clase parece ser generado varias veces. ¿Alguno de ustedes tiene alguna idea sobre por qué, por favor?
me trataron y observaron lo que he mencionado anteriormente utilizando 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 prueba) y luego ver qué tipo de símbolos se han generado como sigue,
nm prueba --demangle
pude ver la siguiente salida.
==== 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 generaron varios controladores (BaseClass - 2, DerivedClass - 3)?
2) ¿Cuáles son la diferencia entre estos dtors? ¿Cómo se usarán esos dtors múltiples de forma selectiva?
Ahora tengo la sensación de que para lograr un 100% de cobertura de funciones para el proyecto C++, tendríamos que entender esto para poder invocar todos esos controladores en mis pruebas unitarias.
apreciaría greately si alguien me podría dar la respuesta a lo anterior.
+1 para incluir un programa de muestra mínimo y completo. (http://sscce.org) –
¿Su clase base tiene intencionalmente un destructor no virtual? –
Una pequeña observación; has pecado y no has hecho que tu destructor BaseClass sea virtual. – Lyke