Lingkungan berkembang: GNU GCC (g ++) 4.1.2
Ketika saya mencoba untuk menyelidiki bagaimana meningkatkan 'cakupan kode - terutama cakupan fungsi' dalam pengujian unit, saya telah menemukan bahwa beberapa dtor kelas tampaknya dibuat beberapa kali. Apakah beberapa dari Anda tahu mengapa?
Saya mencoba dan mengamati apa yang saya sebutkan di atas dengan menggunakan kode berikut.
Dalam "test.h"
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
Dalam "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;
}
Ketika saya membangun kode di atas (g ++ test.cpp -o test) dan kemudian melihat jenis simbol apa yang telah dihasilkan sebagai berikut,
nm --demangle test
Saya bisa melihat output berikut.
==== 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()
Pertanyaan saya adalah sebagai berikut.
1) Mengapa beberapa dtor telah dibuat (BaseClass - 2, DerivedClass - 3)?
2) Apa perbedaan di antara para dtor ini? Bagaimana beberapa dtor tersebut akan digunakan secara selektif?
Sekarang saya merasa bahwa untuk mencapai cakupan fungsi 100% untuk proyek C ++, kami perlu memahami ini sehingga saya dapat memanggil semua dtor tersebut dalam pengujian unit saya.
Saya akan sangat menghargai jika seseorang bisa memberi saya jawaban di atas.