Розвиваюче середовище: 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? Як ці множинні двигуни будуть використовуватися вибірково?
Зараз у мене відчуття, що для досягнення 100% покриття функцій для проекту C ++ нам потрібно це зрозуміти, щоб я міг викликати всі ці dtors у своїх модульних тестах.
Буду дуже вдячний, якщо хтось зможе дати мені відповідь на вищезазначене.