开发环境: GNU GCC (g++) 4.1.2
当我尝试研究如何在单元测试中增加“代码覆盖率-特别是函数覆盖率”时,我发现一些类析构函数似乎被多次生成。请问有人知道为什么吗?
我通过使用以下代码进行了尝试和观察。
在“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 --demangle 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)为什么会生成多个析构函数(BaseClass-2,DerivedClass-3)?
2)这些析构函数有什么区别?多个析构函数将如何被选择性地使用?
我现在有一种感觉,为了实现 C++ 项目的100%功能覆盖率,我们需要理解这一点,以便我可以在我的单元测试中调用所有这些析构函数。
如果有人能够回复我上面的问题,我将非常感激。