C++ 虚函数与纯虚函数:从接口设计到虚析构陷阱
虚函数是我刚接触 C++ 时第一个体会到'面向对象好处'的东西。通过基类指针调用实际对象的方法,多态在这种运行时决策中体现得淋漓尽致。但实际项目里因为忽略了虚析构、随手不写 override 导致的 bug 也不少。这里从头梳理一遍。
虚函数怎么用
让派生类可以重写基类方法,并且通过基类指针/引用调用时能走到派生类的版本,这就是虚函数干的事。语法很简单,在基类方法前加 virtual。
class Base {
public:
virtual void func() { /* ... */ }
};
派生类重写时,我强烈建议写上 override。一是让意图明确,二是如果函数签名写错了(比如少个 const),编译器直接报错,省得运行时发现没调到你写的函数。
一个通用的交通工具例子:
#include <iostream>
#include <string>
using namespace std;
class Vehicle {
public:
virtual void run() {
cout << "交通工具正在行驶" << endl;
}
};
class Car : public Vehicle {
public:
void run() override {
cout << "汽车在公路上飞驰" << endl;
}
};
class Plane : public Vehicle {
public:
void run {
cout << << endl;
}
};
{
Vehicle* v1 = ();
Vehicle* v2 = ();
v1->();
v2->();
v1;
v2;
;
}


