Geliştirme ortamı: GNU GCC (g ++) 4.1.2
Birim testinde 'kod kapsamını - özellikle işlev kapsamını' nasıl artıracağımı araştırmaya çalışırken, bazı sınıf dtorlarının birden çok kez üretildiğini buldum. Bazılarınızın neden olduğuna dair bir fikri var mı?
Aşağıdaki kodu kullanarak yukarıda bahsettiğim şeyi denedim ve gözlemledim.
"Test.h" içinde
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
"Test.cpp" içinde
#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;
}
Yukarıdaki kodu oluşturduğumda (g ++ test.cpp -o test) ve sonra ne tür sembollerin üretildiğini aşağıdaki gibi görünce,
nm - sınır testi
Aşağıdaki çıktıyı görebiliyordum.
==== 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()
Sorularım aşağıdaki gibidir.
1) Neden birden çok dtor oluşturuldu (BaseClass - 2, DerivedClass - 3)?
2) Bu dansçılar arasındaki fark nedir? Bu çoklu dişliler seçici olarak nasıl kullanılacak?
Şimdi, C ++ projesi için% 100 işlev kapsamı elde etmek için, bunu anlamamız gerektiğine dair bir his var, böylece birim testlerimde tüm bu yönlendiricileri çağırabilirim.
Biri bana yukarıdaki cevabı verebilirse çok memnun olurum.