1.带有虚函数的类会多出四个字节的大小,这是一个指针的大小,这个指针的用途是指向虚函数表。
2.继承是虚函数表的顺序
#include <iostream>
using namespace std;
class H
{
virtual void M()
{
cout << "H::H" << endl;
}
};
class A
{
//int num
virtual void g()
{
cout << "A::g" << endl;
}
private:
virtual void f()
{
cout << "A::f" << endl;
}
virtual void j()
{
cout << "A::j" << endl;
}
};
//函数中有虚函数的情况下,这时候多出来了一个指针用于指向虚函数表
class B :public A //,public H
{
void g()
{
cout << "B::g" << endl;
}
virtual void o()
{
cout << "B::o" << endl;
}
virtual void h()
{
cout << "B::h" << endl;
}
};
typedef void(*Fun)(void);
void main()
{
cout << sizeof(A) << endl;
cout << sizeof(H) << endl;
cout << sizeof(B) << endl;
B b;
Fun pFun; //定义一个函数指针
for (int i = 0; i < 5;i++)
{
pFun = (Fun)*((int *)*(int *)(&b) + i);
pFun();
}
cin.get();
}
运行结果:
![]()
3.分析
pFun = (Fun)*((int *)*(int *)(&b) + i);
A:分析*(int *)(&b),这里取的是b对象地址中的内容
B:(int *)*(int *)(&b)表示的是虚函数表的首地址
4.分析*(int *)(&b)
#include <iostream>
using namespace std;
void main()
{
int a = 10;
cout << &a << endl;
cout << *(int *)(&a) << endl;
cin.get();
}
运行结果:
![]()