一、虚函数

类成员方法(除过构造函数)前使用virtual关键字,将函数声明成虚函数。类外实现函数的定义无需在前加virtual关键字。

1
2
3
4
5
6
7
8
class Person
{
public:
virtual void work()
{
cout << "工作" << endl;
}
};

二、多态

静态多态:编译期间就已经确定函数的调用时机(函数重载、运算符重载)
动态多态:运行时确定函数的调用时机

动态多态触发条件:

  1. 公有继承中
  2. 基类含有虚函数&&派生类重写虚函数
  3. 使用基类指针或引用访问派生类成员方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Person
{
public:
virtual void work()
{
cout << "工作" << endl;
}
};
class Student : public Person
{
public:
virtual void work()
{
cout << "学习" << endl;
}
};

class Programmer : public Person
{
public:
virtual void work()
{
cout << "编程" << endl;
}
};

void HowWork(Person* p)
{
p->work();
}
int main()
{
Student stu;
Programmer code;
HowWork(&stu);
HowWork(&code);
return 0;
}

在这里插入图片描述
总结:

  1. 虚函数适用于有继承关系的类对象(类的成员函数才能设置成虚函数)
  2. 静态成员函数不能作为虚函数(不依赖于对象)
  3. 成员函数内联不能作为虚函数(每个对象一份拷贝,无映射关系)
  4. 构造函数不可以作为虚函数(调用构造函数时,对象还未被实例化)
  5. 基类和派生类中动态分配内存空间时,需要将析构函数定义为虚函数(实现析构对象的多态性)