在C++中发生继承多态时,为了在使用父类指针指向子类对象从而调用子类重写方法而不使用父类方法时需要在父类方法定义时前面加入virtual关键字
class Parent{
public:
virtual void func(){
....
}
}
class Child{
public:
void func(){
....
}
}
而编译器会为virtual方法自动创建一个虚指针vptr和虚函数表vtbl,当指针指向某对象时会使用vptr遍历其vtbl寻找相匹配的虚函数,由以下代码可验证vptr的存在
using namespace std;
class Parent1 {
public:
virtual void func() {
cout << "Parent1::func().." << endl;
}
};
class Parent1 {
public:
virtual void func() {
cout << "Parent1::func().." << endl;
}
};
int main()
{
Parent1 p1;
Parent2 p2;
cout << "sizeof(p1):" << sizeof(p1) << endl;
cout << "sizeof(p2):" << sizeof(p2) << endl;
}
输出结果
sizeof(p1):8
sizeof(p2):1
在64位操作系统中
cout << "sizeof(int)" << sizeof(int) << endl;
cout << "sizeof(int*)" << sizeof(int*) << endl;
输出
sizeof(int)4
sizeof(int*)8
一个指针占八字节。