1.c++通过基类指针或者引用调用虚函数时,执行的代码是其真实类型中的函数,是通过虚函数表实现的,虚函数表存放的是指向虚函数地址的虚函数指针
2.代码如下:
#include<iostream>
#include<functional>
using namespace std;
//注意此段代码兼容32位和64位系统,在X86和X64下运行正常
class Base
{
public:
virtual void f1()
{
cout << "Base--f1" << endl;
}
virtual void f2()
{
cout << "Base--f2" << endl;
}
};
class Derive :public Base
{
public:
virtual void f3()
{
cout << "Derive--f3" << endl;
}
virtual void f2() override
{
cout << "Derive--f2" << endl;
}
};
#ifdef _WIN64
typedef long long myInt;
#elif _WIN32
typedef int myInt;
#endif
int main()
{
cout << sizeof(Base) << "--" << sizeof(Derive) << endl;
Base b;
myInt* p_vtbl = reinterpret_cast<myInt*>(&b);
myInt* vtbl = reinterpret_cast<myInt*>(*p_vtbl);
typedef void(*Func)();
Func fun1 = reinterpret_cast<Func>(vtbl[0]);
fun1();
Func fun2 = reinterpret_cast<Func>(vtbl[1]);
fun2();
cout << "----------------------------" << endl;
cout << "----------------------------" << endl;
Derive d;
p_vtbl = reinterpret_cast<myInt*>(&d);
vtbl = reinterpret_cast<myInt*>(*p_vtbl);
fun1 = reinterpret_cast<Func>(vtbl[0]);
fun1();
fun2 = reinterpret_cast<Func>(vtbl[1]);
fun2();
}
3.运行结果如下:
X64下编译
X86下编译
4.内存图
5.虚函数不能inline
6.类的构造函数谨慎用memset(this,o,sizeof(this)),意味这样会破坏虚函数表