การพัฒนาสภาพแวดล้อม: 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) จากนั้นดูว่ามีการสร้างสัญลักษณ์ประเภทใดดังนี้
นาโนเมตร - การทดสอบความผิดเพี้ยน
ฉันเห็นผลลัพธ์ต่อไปนี้
==== 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% สำหรับโปรเจ็กต์ C ++ เราจำเป็นต้องเข้าใจสิ่งนี้เพื่อที่ฉันจะสามารถเรียกใช้ dtors เหล่านั้นทั้งหมดในการทดสอบหน่วยของฉันได้
ฉันจะขอบคุณเป็นอย่างยิ่งหากมีใครสามารถตอบกลับฉันด้านบนได้