虚函数表
来源:互联网 发布:360手机网络修复器 编辑:程序博客网 时间:2024/06/11 06:01
虚表只存的地址
class Base
{
public:
virtual void func1()
{}
virtual void func2()
{}
private:
int a;
};
void Test1()
{
Base b1;//虚函数表指针_vfptr,虚函数的重写,完成多态,指向虚函数的一张表,其实是个数组,指针数组,存的虚函数的地址
cout << sizeof(b1) << endl;//b1是多大呢?如果是64位程序,就是12个字节,平台很重要,一般是8
}
int main()
{
Test1();
system("pause");
return 0;
}
虚函数表如下:
程序改进如下:
class Base
{
public:
virtual void func1()
{
cout << "Base::func1"<<endl;
}
virtual void func2()
{
cout << "Base::func2" << endl;
}
private:
int a;
};
class Derive :public Base
{
public:
virtual void func1()
{
cout << "Derive::func1" << endl;
}
virtual void func3()
{
cout << "Derive::func3" << endl;
}
virtual void func4()
{
cout << "Derive::func4" << endl;
}//func3和func4去哪了?编译器的优化,也算是编译器的bug,它在但是没显示,用内存看一下
private:
int b;
};
这里构成单继承对象模型:
写个函数打印出虚函数表如下:
class Base
{
public:
virtual void func1()
{
cout << "Base::func1"<<endl;
}
virtual void func2()
{
cout << "Base::func2" << endl;
}
private:
int a;
};
class Derive :public Base
{
public:
virtual void func1()
{
cout << "Derive::func1" << endl;
}
virtual void func3()
{
cout << "Derive::func3" << endl;
}
virtual void func4()
{
cout << "Derive::func4" << endl;
}//func3和func4去哪了?编译器的优化,也算是编译器的bug,它在但是没显示,用内存看一下
private:
int b;
};
typedef void(*V_FUNC)();
void PrintVTable(int* vtable)//传虚表,打印虚函数表
{
printf("虚函数表:%p\n", vtable);
for (size_t i = 0; vtable[i] != 0; ++i)
{
printf("vfunc[%d]:%p->", i, vtable[i]);
V_FUNC f = (V_FUNC)vtable[i];
f();
}
}
int main()
{
Base b;
Derive d;
int * vtable = (int*)*(int*)&d;//区地址,强转,解引用为int,头结点,在再强转为int*
PrintVTable(vtable);
PrintVTable((int*)(*((int*)&b)));
system("pause");
return 0;
}
由此可以看出虚函数表中未能显示的func3和func4的地址。
- 虚函数,虚析构函数,虚函数表
- 虚函数 虚函数表
- 虚函数表 构造函数
- 虚函数和纯虚函数及虚函数表
- 子类虚函数表(包括虚函数+函数)
- 虚函数、虚函数表、虚继承
- 通过函数指针使用虚函数表中的函数
- 虚函数表指针,虚函数表
- 虚函数表指针,虚函数表
- 关于 [虚函数] 和 [虚函数表]
- C++虚函数与虚函数表
- C++虚函数与虚函数表
- 虚函数与虚函数表
- c++ 虚函数和虚函数表
- c++虚函数和虚函数表
- [收集]虚函数及虚函数表
- C++ 虚函数,虚函数表
- C++虚函数与虚函数表
- ARM 常用寄存器
- ios开发之验证你的服务器ATS是否PASS
- HTML自闭合标签末尾的斜杠问题
- Linux学习3-Linux命令
- Spring 支持的事务传播行为
- 虚函数表
- 老铁,邀请你来免费学习人工智能!!!
- 二叉树的抽象数据类型
- Android-使用adb和aapt查看应用信息
- Cg Programming/Unity/Lighting of Bumpy Surfaces凹凸曲面光照
- unity初始5(生命周期、协同、优化、WWW类)
- c#的dllimport使用方法详解
- mybatis映射器注解
- BOOL 值在 debug 和 release 模式下初始化不一样!!!