查看C++类的虚表(vtable)结构

假定源文件如下:

#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
对这个虚表结构还不是很明白,比如,为什么里面会有两个析构函数呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值