Môi trường đang phát triển: GNU GCC (g ++) 4.1.2
Trong khi tôi đang cố gắng điều tra cách tăng 'mức độ bao phủ mã - đặc biệt là mức độ bao phủ chức năng' trong kiểm thử đơn vị, tôi nhận thấy rằng một số lớp dtor dường như được tạo nhiều lần. Có ai trong số các bạn có ý kiến về lý do tại sao không?
Tôi đã thử và quan sát những gì tôi đã đề cập ở trên bằng cách sử dụng mã sau.
Trong "test.h"
class BaseClass
{
public:
~BaseClass();
void someMethod();
};
class DerivedClass : public BaseClass
{
public:
virtual ~DerivedClass();
virtual void someMethod();
};
Trong "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;
}
Khi tôi tạo mã ở trên (g ++ test.cpp -o test) và sau đó xem loại ký hiệu nào đã được tạo như sau,
nm - kiểm tra hình tam giác
Tôi có thể thấy kết quả sau.
==== 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()
Câu hỏi của tôi như sau.
1) Tại sao nhiều dtors đã được tạo ra (BaseClass - 2, DerivedClass - 3)?
2) Sự khác biệt giữa các dtors này là gì? Làm thế nào nhiều dtors đó sẽ được sử dụng có chọn lọc?
Bây giờ tôi có cảm giác rằng để đạt được mức bao phủ 100% hàm cho dự án C ++, chúng ta cần hiểu điều này để tôi có thể gọi tất cả các dtor đó trong các bài kiểm tra đơn vị của mình.
Tôi sẽ đánh giá rất cao nếu ai đó có thể cho tôi câu trả lời ở trên.