1. 在C++中,使用父类引用指向子类对象时,如果执行的函数是普通函数,则属于地址早绑定,即使传入的是子类的对象,也会执行父类的方法!
class Animal{ public: void speak(){ cout<<"Animal!"<<endl; } }; class Cat :public Animal{ void speak(){//不会被执行 cout<<"Cat!"<<endl; } }; void doSpeak(Animal &animal){ animal.speak();//地址早绑定 } int main(){ Cat cat; doSpeak(cat);//输出"Animal!" return 0; }
2. 为了实现地址晚绑定,也就是能执行子类的方法,应把父类的方法置为虚函数,在父类方法上使用virtual关键字
class Animal{ public: virtual void speak(){//virtual关键字,变为虚函数 cout<<"Animal!"<<endl; } }; class Cat :public Animal{ virtual void speak(){ cout<<"Cat!"<<endl; } }; void doSpeak(Animal &animal){ animal.speak();//执行时动态绑定 } int main(){ Cat cat; doSpeak(cat);//输出"Cat!" return 0; }
C++多态条件:有继承,子类重写父类虚函数
3. 虚函数表
4. 纯虚函数
通常父类实现的虚函数内容是不需要的,因此可以把虚函数改成纯虚函数;
virtual void speak()=0;//不需要写实现了
当类中有了纯虚函数,它就成了抽象类,它就不能实例化对象了。
子类也必须重写父类的纯虚函数,否则不能实例化对象。