虚函数的定义
虚函数是面向对象编程(特别是在 C++ 等语言中)中的一个核心概念。它允许你在子类中重新定义父类的方法,并且确保在程序运行时,系统能够根据对象的实际类型(而不是定义类型)来决定调用哪个函数。这种行为被称为动态绑定或多态。
首先为什么会需要虚函数?
从上面解释可以看出来虚函数的作用是重新定义父类的方法,然后程序运行后可以根据实际对象来决定调用哪个函数(也就是说如果不使用虚函数会出现实际调用的对象函数并不是自己原本想调用的)。
出现这种情况的原因在于编译器的默认行为,C++ 的设计原则是'静态类型检查'和'高性能'。在编译阶段时,编译器看到一个类型的指针变量后(比如说 Shape*指针),它的逻辑是:
- 这个指针将来可能指向一个 Shape 对象。
- 这个指针占有 8 字节(64 位系统),里面存储一个地址。
这个时候编译器就会去 Shape 类里面找对应的函数(比如说 draw 函数),然后把调用指令编译进去,而这个时候如果你把 Shape 的子类 Circle 对象的地址赋值给这个指针,编译器在编译过程中是并不知道这一点的(因为赋值是发生在运行期间)。所以说编译出来的指令依旧是调用 Shape::draw 的命令。这种在编译阶段就决定调用哪个函数的方式,叫做静态绑定(Static Binding)或早绑定,而虚函数就是为了解决这个问题设计的。
这里我们可以来看一下结果
#include <iostream>
using namespace std;
// 基类:形状
class Shape {
public:
void draw() {
cout << "画一个通用的形状" << endl;
}
};
// 派生类:圆形
class Circle : public Shape {
public:
void draw(){
cout << "画一个圆形" << endl;
}
};
// 派生类:矩形
class Rectangle : public Shape {
public:
void draw() {
cout << "画一个矩形" << endl;
}
};
int main() {
Shape* s;
Circle c;
Rectangle r;
s = &c;
s->();
s = &r;
s->();
;
}

