1. 普通虚函数(Virtual Function)
- 定义:基类中用
virtual
声明,允许派生类 覆盖(Override)。 - 特点:
- 基类可提供默认实现。
- 派生类可选择性覆盖(若不覆盖,则调用基类版本)。
- 示例:
class Shape { public:virtual void draw() {cout << "Drawing a shape." << endl;} };
2. 纯虚函数(Pure Virtual Function)
-
定义:基类中用
virtual
声明并以= 0
结尾,强制派生类必须实现。 -
特点:
- 基类成为 抽象类(Abstract Class),无法实例化。
- 用于定义接口规范,强制派生类遵守。
-
示例:
class Shape { public:virtual void draw() = 0; // 纯虚函数 };
3. 虚析构函数(Virtual Destructor)
- 定义:基类的析构函数声明为
virtual
,确保派生类对象通过基类指针删除时,能正确调用派生类的析构函数。 - 场景:基类指针指向派生类对象时,必须使用虚析构函数以避免资源泄漏。
- 现象:先执行派生类析构函数,再执行基类析构函数
#include <iostream>// 基类
class Base {
public:// 虚析构函数virtual ~Base() {std::cout << "Base class destructor" << std::endl;}
};// 派生类
class Derived : public Base {
public:~Derived() override {std::cout << "Derived class destructor" << std::endl;}
};int main() {// 通过基类指针创建派生类对象Base* basePtr = new Derived();// 删除基类指针delete basePtr;return 0;
}
4. 关键词 (C++11)
一、override
显式标记派生类中对基类虚函数的重写,强制编译器检查函数签名是否完全匹配,避免因拼写错误或参数不匹配导致意外定义新函数
二、final
修饰类:禁止类被继承(如工具类或不可变类)。
修饰虚函数:禁止派生类进一步重写该函数(如关键算法或接口)。
class Base {
public:virtual void log() final { // 禁止派生类覆盖cout << "Base log." << endl;}
};
#include <iostream>// 基类
class Base {
public:// 虚函数virtual void print() {std::cout << "This is the Base class." << std::endl;}
};// 派生类
class Derived : public Base {
public:// 重写基类的虚函数void print()final {std::cout << "This is the Derived class." << std::endl;}
};// 派生类的派生类
/*
class Deriveder : public Derived {
public:// 重写基类的虚函数void print() override {std::cout << "This is the Deriveder class." << std::endl;}
};
*/// 多态函数
void callPrint(Base* obj) {obj->print();
}int main() {Base base;Derived derived;//Deriveder Deriveder;// 调用多态函数callPrint(&base);callPrint(&derived);//callPrint(&Deriveder);return 0;
}