虚函数介绍
虚函数是面向对象编程中的重要概念,当从父类中继承的时候,虚函数和被继承的函数具有相同的签名。但是在程序运行过程中,系统会自动选择适当的函数进行调用。虚函数是动态绑定的基础。虚函数必须是非静态成员函数。虚函数经过派生后,在类族中就可以实现运行过程中的多态。
根据赋值兼容规则,可以使用派生类的对象代替基类对象。如果用基类类型的指针指向派生类对象来访问它的成员,访问到的只是从基类继承来的同名成员。如果你希望调用的是派生类中重新实现的成员函数,那么你只要将基类中的同名函数声明为虚函数就可以了。
一般虚函数成员的声明方法为:
virtual 函数类型 函数名(形参表);
虚函数的声明智能出现在类定义中的函数原型声明中,而不能在成员函数实现的时候。运行过程中的对台需要满足3个条件:
- 类之间满足赋值兼容规则
- 声明虚函数
- 由成员函数来调用或者是通过指针、引用来访问虚函数(如果是通过对象名来访问虚函数,则绑定是静态的,也就是在编译过程中就进行了绑定)。
注意:虚函数一般不声明为内联函数,因为对虚函数的调用需要动态绑定,而对内联函数的处理是静态的,所以虚函数一般以内联函数处理。但将虚函数声明为内联函数也不会引起错误。
示例
#include <iostream>
using namespace std;
class Base
{
public:
virtual void display() const;
};
void Base::display() const {
cout << "Base dispaly" << endl;
}
class Base1 : public Base
{
public:
void display() const;
};
void Base1::display() const {
cout << "Base1 dispaly" << endl;
}
class Base2 : public Base1
{
public:
void display() const;
};
void Base2::display() const {
cout << "Base2 dispaly" << endl;
}
void fun(Base *var)
{
var->display();
}
int main (int argc, char *argv[])
{
Base va;
Base1 vb;
Base2 vc;
fun(&va);
fun(&vb);
fun(&vc);
return 0;
}
运行结果为:
Base dispaly
Base1 dispaly
Base2 dispaly
如果不把基类Base的成员函数display()声明为虚函数,那么程序三次调用的都会是基类Base的display()函数。