开发环境: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();
};
Run Code Online (Sandbox Code Playgroud)
在"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* …Run Code Online (Sandbox Code Playgroud) 我知道虚函数有一个解除引用调用方法的开销.但我想现代建筑速度几乎可以忽略不计.
更新:
总结来自Jon Skeet的答案如下:
明确地让某人意识到他们正在继承功能[这本身就有潜在的风险[(检查Jon的回应)] [和潜在的小的性能提升]之间需要权衡,需要通过权衡来减少灵活性,增加代码更多,以及更陡峭的学习曲线.
不同答案的其他原因:
虚函数不能内联,因为内联必须在运行时发生.当您希望通过内联功能获益时,这会对性能产生影响.
可能还有其他原因,我很想知道并总结它们.
据我所知,当基类具有虚函数时,C ++可以获取对象动态类型的准确信息。
class Base
{
public:
Base() {}
~Base() { std::cout << "Base Destructed" << std::endl; }
virtual void f() {}
};
class Derived : public Base
{
public:
Derived() {}
~Derived() { std::cout << "Derived Destructed" << std::endl; }
};
void PrintTypeName(Base *p)
{
std::cout << typeid(*p).name() << std::endl;
}
int main()
{
Base *p = new Derived();
PrintTypeName(p);
delete p;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以打印正确的对象类型,但是为什么它不能调用正确的析构函数。
我在g ++和Windows编译器上对其进行了测试,它们给出了相同的结果。我知道如果我使Base析构函数virtual,它可以正确地分解。
但是我想知道为什么不通过调用析构函数typeid。