什么是虚函数
虚函数是指在类中,以virtual说明符进行描述的非静态成员函数。
下面是一个虚函数应用的举例。
#include <iostream>
using namespace std;
//基类
class Base {
public:
Base() = default;
virtual void print() {
cout << "Base" << endl;
}
virtual ~Base() = default;
};
//派生类
class Derived: public Base {
public:
Derived() = default;
void print() override {
cout << "Derived" << endl;
}
~Derived() = default;
};
class Derived_2: public Base {
public:
Derived_2() = default;
void print() override {
cout << "Derived_2" << endl;
}
~Derived_2() = default;
}
void test(Base *base) {
base->print();
}
int main()
{
Base *base1 = new Base();
test(base1);
Base *derived1 = new Derived();
test(derived1);
Base *derived2 = new Derived_2();
test(derived2);
}
执行上述代码,可得:
$ ./test_virtual.exe
Base
Derived
Derived_2
可以看到,在test函数中,对于同一个Base类的指针,入参为base1和base2所执行的print结果是不一样的,base1作为入参时test执行的是基类的print;而derived1作为入参时test执行的却是派生类Derived的print函数。
这就是C++中动态多态的概念(还有一种叫静态多态,是通过模板实现,在编译时实现,故称为静态),即使用基类(上面的Base)的指针(或引用)指向派生类对象,并调用对应的虚函数(上面的print)。这样对于同一个函数(上面的test),通过传入不同的对象,来执行对应对象的print实现。
动态多态(在运行时确定,故称为动态)必须满足两个条件:
- 必须通过基类的指针或引用调用函数
- 调用的函数必须为虚函数,并且派生类对基类的虚函数进行了覆写(override)