Ambiente di sviluppo: GNU GCC (g ++) 4.1.2
Mentre sto cercando di indagare su come aumentare la "copertura del codice, in particolare la copertura delle funzioni" nei test unitari, ho scoperto che alcuni dtor di classe sembrano essere generati più volte. Alcuni di voi hanno idea del perché, per favore?
Ho provato e osservato ciò che ho menzionato sopra utilizzando il seguente codice.
In "test.h"
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
In "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 ho creato il codice sopra (g ++ test.cpp -o test) e poi ho visto che tipo di simboli sono stati generati come segue,
nm: test di demangle
Ho potuto vedere il seguente output.
==== 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()
Le mie domande sono le seguenti.
1) Perché sono stati generati più dtor (BaseClass - 2, DerivedClass - 3)?
2) Quali sono le differenze tra questi medici? Come verranno utilizzati selettivamente quei medici multipli?
Ora ho la sensazione che per ottenere il 100% di copertura delle funzioni per il progetto C ++, avremmo bisogno di capirlo in modo da poter invocare tutti quei medici nei miei unit test.
Apprezzerei molto se qualcuno potesse darmi la risposta sopra.