C++中的虚函数指的是class类中加上了关键字virtual
的函数。
虚函数的意义在于动态绑定,也就是说父类指针可以调用子类的函数实现,示例如下:
#include "stdio.h"
class Animal {
public:
virtual void name() { printf("I'm Animal\n"); }
};
class Cat : public Animal {
public:
virtual void name() override { printf("I'm Cat\n"); }
};
void func(Animal *animal) {
animal->name();
}
int main(void) {
func(new Animal());
func(new Cat());
return 0;
}
输出的结果如下:
I'm Animal
I'm Cat
这里可以看出虽然函数里是父类的指针,但是实际调用的函数根据传进来的类动态变化。
下面是另外一个例子:
#include "stdio.h"
class Animal {
public:
virtual void name() { printf("I'm Animal\n"); }
};
class Cat : public Animal {
public:
virtual void name() override { printf("I'm Cat\n"); }
};
void foo(Animal a, Cat b, Animal *r) {
a.name();
b.name();
r->name();
}
int main(void) {
Cat b;
foo((Animal) b, b, &b);
return 0;
}
运行结果如下:
I'm Animal
I'm Cat
I'm Cat
这段代码人意思很好理解,我们着重看一下foo函数的汇编代码:
可以看到对于固定对象调用虚函数,调用是直接写死在汇编代码中的,被称为静态绑定。
如果使用父类的指针调用虚函数,具体调用哪个函数是动态绑定,也就是运行代码时才知道的。