#include <memory>
class Base
{
public:
virtual void print(){ printf("Base::print()\n");}
void print2(){}
public:
int m_id;
};
class Imp : public Base
{
private:
void print(){ printf("Imp::print()\n");}
};
template<class T>
void swap(T& a, T& b)
{
T tmp;
tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 1, b = 2;
swap(a, b);
Base* pBase = new Base();
Base* pImp = new Imp();
__asm // pImp->print()汇编实现(去除那些Debug调试信息)
{
mov eax,dword ptr [pImp] //获取pImp这个指针数据值,可以理解pImp是个整形变量,取整形变量内的值即指针
mov edx,dword ptr [eax] //获取pImp第一个数据地址,即虚函数表地址
mov eax,dword ptr [edx] //获取虚函数表指针指向的第一个函数指针
call eax //调用Imp::print()
}
pBase->print();
pBase->m_id = 5;
getchar();
return 0;
}
上面插入的一段汇编就是虚函数调用,可以vs IDE下通过反汇编Alt+8,查看。
1、只要这个类中有虚函数,则此类就有属于自己的虚函数表指针;
2、虚函数表指针隐藏在类的内存数据的最前面4个字节(32位程序,指针长度);
3、虚函数每次调用都需要通过虚函数表指针锁定到指定地址才可以调用。