多态与虚函数
注意
在成员函数(静态成员、构造函数和析构函数除外)中调用同类的虚函数的语句是多态的。
在构造函数和析构函数中调用虚函数不是多态的,编译时即可以确定调用的是哪个函数。
编译器看到是哪个类的指针,那么就会认为通过它访问的,就应该是哪个类的成员,编译器不会分析基类指针到底指向的是基类对象还是派生类对象。
-
区分多态和非多态的情况:
- 通过基类指针或引用调用成员函数的语句,只有当该成员函数是虚函数时才会是多态。如果该成员函数不是虚函数,那么这条函数调用语句就是静态联编的,编译时就能确定调用的是那个类的成员函数。
- 另外,C++语言规定,只要在基类中某个函数被声明为虚函数,那么,在派生类中,同名同参数表的成员函数即使前面不写
virtual
关键字,也自动成为虚函数.
总结
通过基类的指针,调用基类和派生类中都有的同名虚函数时,基类指针指向的是基类对象,执行的就是基类的虚函数,基类指针如果指向派生类对象,执行的就是派生类的虚函数,这就称为多态。多态也适用于通过基类引用调用基类和派生类中都有的同名虚函数的情况。
多态是通过虚函数表来实现的。
在普通成员数中调用虚函数是多态的,但在构造函数和析构函数中调用虚函数不是多态的。
有虚函数的类,其析构函数也应该实现为虚函数
包含纯虚函数的类称为抽象类。不能用抽象类定义对象。抽象类的派生类,仅当实现了所有的纯虚函数,才会变成非抽象类。