虚函数
1.1 虚函数的定义
虚函数(Virtual Function)是基类中声明、允许派生类重新定义的成员函数。在函数名前加 virtual 修饰即可。注意:非成员函数不能加 virtual 修饰。
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
1.2 虚函数的重写/覆盖
当派生类中存在一个与基类虚函数完全相同的函数(返回值类型、函数名、参数列表一致,缺省值可不同),即构成重写。虽然派生类不加 virtual 也能继承虚属性,但为了规范起见,建议显式添加。
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
class Student : public Person {
public:
// 派生类可以不加 virtual,继承后仍保持虚函数属性
void BuyTicket() {
cout << "买票 - 打折" << endl;
}
};
void Func(Person* ptr) {
// 多态调用:由 ptr 指向的实际对象决定
ptr->BuyTicket();
}
1.3 虚函数重写的其他问题
1.3.1 协变
派生类重写基类虚函数时,若基类返回基类指针/引用,派生类返回派生类指针/引用,称为协变。这在实际开发中意义有限,了解即可。
1.3.2 析构函数的重写
基类析构函数必须为虚函数。如果通过基类指针删除派生类对象,且基类析构函数非虚,将导致派生类析构函数未被调用,引发内存泄漏。编译器会将析构函数名称统一处理为 destructor,因此只要基类加了 virtual,派生类无论是否加都构成重写。


