虚函数的作用

1. 虚函数

虚函数 的目的是为了允许用基类的指针调用子类的虚函数,是必须实现 的函数。虚函数是C++实现动态单分派子类型多态 的方式:

  • 动态:在运行时决定的
  • 单分派:基于一个类型去选择调用哪个函数
  • 子类型多态:以子类-父类关系实现多态

下面通过一个例子来具体说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
public:
virtual void foo()
{
cout<<"A::foo() is called"<<endl;
}
};
class B:public A
{
public:
void foo()
{
cout<<"B::foo() is called"<<endl;
}
};
int main(void)
{
A *a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
return 0;
}

虚函数只能借助于指针或者引用来达到多态的目的,核心理念就是通过基类访问派生类定义的函数。

2. 纯虚函数

纯虚函数 是在基类中定义,但不能实现 ,只能由其派生类自己定义实现此函数。形式如下:

virtual ReturnType Function()=0

引入纯虚函数的好处:

  • 纯虚函数定义了一个接口 ,起到了规范作用
  • 包含纯虚函数的类是抽象类,抽象类是不能被实例化的。如果派生类没有实现纯虚函数,那么此派生类也是抽象类;如果派生类给出了基类中的纯虚函数的实现,那么此派生类就不是抽象类。

注:

  • 析构函数是虚函数;
  • 友元函数不是虚函数,但它可以通过调用虚函数来解决友元的虚拟问题。