假定源文件如下:
#include <iostream>
#include <map>
class IA
{
public:
virtual ~IA() {}
virtual void PrintA() = 0;
virtual void PrintB() = 0;
virtual void PrintC() = 0;
};
class A : public IA
{
public:
A();
~A();
void PrintA();
void PrintB();
void PrintC();
private:
std::map<int, std::string> m_map;
};
A::A()
{
m_map.insert(std::pair<int, std::string>(1, "hello"));
m_map.insert(std::pair<int, std::string>(2, "world"));
m_map.insert(std::pair<int, std::string>(3, "merry"));
}
A::~A()
{
std::map<int, std::string>::iterator iter;
for(iter = m_map.begin(); iter != m_map.end(); ++iter)
{
m_map.erase(iter);
}
}
void A::PrintA()
{
std::map<int, std::string>::iterator iter = m_map.find(1);
std::cout <<iter->second << std::endl;
}
void A::PrintB()
{
}
void A::PrintC()
{
}
int main(void)
{
IA *pA = new A();
pA->PrintA();
delete pA;
pA->PrintA();
return 0;
}
执行命令:
arm-linux-gnueabi-g++ -fdump-class-hierarchy test500.cpp
会生成一个文件 test500.cpp.002t.class
其中有如下的内容:
Vtable for IA
IA::_ZTV2IA: 7u entries
0 (int (*)(...))0
4 (int (*)(...))(& _ZTI2IA)
8 (int (*)(...))IA::~IA
12 (int (*)(...))IA::~IA
16 (int (*)(...))__cxa_pure_virtual
20 (int (*)(...))__cxa_pure_virtual
24 (int (*)(...))__cxa_pure_virtual
Vtable for A
A::_ZTV1A: 7u entries
0 (int (*)(...))0
4 (int (*)(...))(& _ZTI1A)
8 (int (*)(...))A::~A
12 (int (*)(...))A::~A
16 (int (*)(...))A::PrintA
20 (int (*)(...))A::PrintB
24 (int (*)(...))A::PrintC
对这个虚表结构还不是很明白,比如,为什么里面会有两个析构函数呢?