Ambiente de desenvolvimento: GNU GCC (g ++) 4.1.2
Enquanto estou tentando investigar como aumentar a 'cobertura de código - particularmente a cobertura de função' em testes de unidade, descobri que parte da classe dtor parece ser gerada várias vezes. Alguns de vocês têm ideia do porquê, por favor?
Eu tentei e observei o que mencionei acima usando o código a seguir.
Em "test.h"
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
Em "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;
}
Quando eu construí o código acima (g ++ test.cpp -o test) e vejo que tipo de símbolos foram gerados da seguinte maneira,
nm - teste demangle
Eu pude ver a seguinte saída.
==== 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()
Minhas perguntas são as seguintes.
1) Por que vários dtors foram gerados (BaseClass - 2, DerivedClass - 3)?
2) Quais são as diferenças entre esses dtores? Como esses múltiplos dtors serão usados seletivamente?
Agora tenho a sensação de que, para atingir 100% de cobertura de função para o projeto C ++, precisaríamos entender isso para que eu possa invocar todos aqueles dtors em meus testes de unidade.
Eu apreciaria muito se alguém pudesse me dar a resposta sobre o acima.