Развивающаяся среда: GNU GCC (g++) 4.1.2
Пока я пытаюсь выяснить, как увеличить "охват кода, особенно покрытие функций" при модульном тестировании, я обнаружил, что некоторые из классов dtor, кажется, генерируются несколько раз. Кто-нибудь из вас знает, почему, пожалуйста?
Я попробовал и заметил, что я упомянул выше, используя следующий код.
В "test.h"
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
В "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;
}
Когда я построил вышеуказанный код (g++ test.cpp -o test), а затем посмотрел, какие символы были сгенерированы следующим образом,
nm - испытание на дефекты
Я мог видеть следующий вывод.
==== 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()
Мои вопросы заключаются в следующем.
1) Почему несколько dtors были сгенерированы (BaseClass - 2, DerivedClass - 3)?
2) Какая разница между этими dtors? Как будут использоваться эти множественные dtors?
У меня теперь есть ощущение, что для достижения 100% -ного покрытия функций для проекта С++ нам нужно было бы это понять, чтобы я мог вызывать все эти dtors в своих модульных тестах.
Я был бы очень признателен, если бы кто-нибудь мог дать мне ответ на вышеупомянутое.