C++中的虚函数与纯虚函数
文章目录
- 虚函数 (Virtual Function)
- 纯虚函数 (Pure Virtual Function)
- 主要区别
- 实际应用示例
C++中的虚函数和纯虚函数是实现多态性的重要机制。
虚函数 (Virtual Function)
虚函数是在基类中用virtual
关键字声明的函数,它允许派生类重写(override)该函数的实现。当通过基类指针或引用调用虚函数时,会根据对象的实际类型来决定调用哪个版本的函数,这就是动态绑定或运行时多态。
class Base {
public:virtual void show() {cout << "Base class show function" << endl;}virtual ~Base() {} // 虚析构函数
};class Derived : public Base {
public:void show() override {cout << "Derived class show function" << endl;}
};
纯虚函数 (Pure Virtual Function)
纯虚函数是在虚函数声明后面加上= 0
的函数,它没有实现。包含纯虚函数的类被称为抽象类,不能被实例化。派生类必须实现所有纯虚函数才能被实例化。
class AbstractBase {
public:virtual void pureVirtualFunction() = 0; // 纯虚函数virtual void normalVirtualFunction() { // 普通虚函数cout << "Normal virtual function" << endl;}virtual ~AbstractBase() {}
};
主要区别
实现方面:虚函数有默认实现,纯虚函数没有实现
类的实例化:包含纯虚函数的类是抽象类,不能实例化;只包含虚函数的类可以实例化
派生类要求:派生类可以选择是否重写虚函数,但必须实现所有继承的纯虚函数
设计意图:虚函数提供默认行为但允许定制,纯虚函数强制派生类提供具体实现
实际应用示例
#include <iostream>
#include <vector>
#include <memory>
using namespace std;// 抽象基类
class Animal {
public:virtual void makeSound() = 0; // 纯虚函数virtual void sleep() { // 虚函数cout << "Animal is sleeping" << endl;}virtual ~Animal() {}
};class Dog : public Animal {
public:void makeSound() override {cout << "Woof!" << endl;}
};class Cat : public Animal {
public:void makeSound() override {cout << "Meow!" << endl;}void sleep() override {cout << "Cat is sleeping on the sofa" << endl;}
};int main() {vector<unique_ptr<Animal>> animals;animals.push_back(make_unique<Dog>());animals.push_back(make_unique<Cat>());for (auto& animal : animals) {animal->makeSound(); // 多态调用animal->sleep(); // 多态调用}return 0;
}
这种设计模式在实际开发中非常有用,比如图形界面框架中的控件基类、游戏引擎中的实体类、以及各种设计模式的实现中都会大量使用虚函数和纯虚函数来实现灵活的多态架构。