class Animal
{
public:
virtual void Speak()
{
cout << "动物在说话。" << endl;
}
};
class Cat :public Animal
{
public:
void Speak()
{
cout << "猫在说话" << endl;
}
};
Animal类中的speak()加virtual之前
加virtual之后
类中存放一个指针v(virtual)f(function)ptr(pointer)指向v(virtual)f(function)table。
虚函数表中存放虚函数的地址
对于Cat(未重写Speak函数)
Cat继承了父类的虚函数指针和虚函数表。
加virtual并重写Speak函数之后
Cat类中的虚函数表内部被替换为Cat类的虚函数地址。
父类的指针或引用指向子类的对象时发生动态多态。
PS:
多态分为两类:
静态多态:函数重载,运算符重载
动态多态:派生类和虚函数实现运行时多态
区别:
静态多态:编译阶段确定函数地址(早绑定)
动态多态:运行阶段确定函数地址(晚绑定)