一.虚标的产生
虚表的产生是依靠重写虚函数
class person
{
public:
virtual void buyticket()
{
cout << "普通人买票" << endl;
}
void buy()
{
cout << "普通人买辆车" << endl;
}
};
class student:public person
{
public:
void buyticket()
{
cout << "学生买票" << endl;
}
void buy()
{
cout << "学生买辆车" << endl;
}
}
void fun(person& a)
{
a.buyticket();
/*a.buy();*/
}
int main()
{
fun(new person);
fun(new student);
}
此时就发生了多态,结果会打印普通人买票和学生买票这两种结果,此时person和student所产生的两个对象都含有不同的虚表。
如果调用buy就会只打印父类的函数“普通人买辆车”
二 虚表的结构
这就是父类对象和子类对象的虚表
虚表就是存储此对象里所有虚函数的表格
从这里就可以看出父类对象和子类对象储存的虚表不相同,因此,当发生对象切片时,满足多态条件时,指针就可以通过不同虚表上的储存的函数地址调用对应函数,发生多态
三 注意事项
对于虚表而言,无论是发生切片或者拷贝,都不会使虚表发生覆盖