Environnement de développement: GNU GCC (g ++) 4.1.2
Alors que j'essaie d'étudier comment augmenter la `` couverture du code - en particulier la couverture des fonctions '' dans les tests unitaires, j'ai constaté qu'une partie de la classe dtor semble être générée plusieurs fois. Certains d'entre vous ont-ils une idée de pourquoi, s'il vous plaît?
J'ai essayé et observé ce que j'ai mentionné ci-dessus en utilisant le code suivant.
Dans "test.h"
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
Dans "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;
}
Quand j'ai construit le code ci-dessus (g ++ test.cpp -o test) et que j'ai vu le type de symboles générés comme suit,
nm - test de démangle
Je pouvais voir la sortie suivante.
==== 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()
Mes questions sont les suivantes.
1) Pourquoi plusieurs dtors ont-ils été générés (BaseClass - 2, DerivedClass - 3)?
2) Quelle est la différence entre ces dtors? Comment ces multiples détecteurs seront-ils utilisés de manière sélective?
J'ai maintenant le sentiment que pour atteindre une couverture de fonctions à 100% pour le projet C ++, nous aurions besoin de comprendre cela afin que je puisse invoquer tous ces dtors dans mes tests unitaires.
J'apprécierais beaucoup si quelqu'un pouvait me donner la réponse sur ce qui précède.