静态多态:地址早绑定,在编译阶段确定地址
动态多态:地址晚绑定,在运行阶段确定地址
class Base
{
public:
virtual void speak()
{
cout<<"hello"<<endl;
}
};
class Speak:public Base
{
void speak()
{
cout<<"HELLO"<<endl;
}
};
void dospeak(Base &BB)//父类的引用
{
BB.spaek();
}
void test()
{
Speak S;
dospeak(S);
}
在父类同名函数前加上virtual则实现地址晚绑定(重写speak函数),输出的是HELLO,否则地址早绑定输出的是hello
动态多态的满足条件:
1.有继承关系;2.子类重写父类的虚函数(内容不同,参数列表相同)
动态多态的使用:
父类的指针或引用 指向子类对象
如果父类中的同名函数不是虚函数,那么父类的指针就算指向子类对象,调用的也是父类的函数,因为函数并没有被重写。
加上virtual后创建了一个虚函数指针,指向虚函数表,地址是父类虚函数。如果子类重写了该函数,则继承的虚函数表中的地址变成子类重写后的的虚函数。
子类与父类的同名函数参数表不一样的话不能构成虚函数