C++之仿函数和虚函数

仿函数(Functor)虚函数(Virtual Function)是 C++ 中两个不同的概念,它们在功能和使用场景上有显著的区别。

1. 仿函数(Functor)

定义:

仿函数(也称为函数对象)是指可以像函数一样调用的对象。它通过重载类中的 operator() 实现函数调用的行为。

主要特点:
  • 仿函数是通过重载 operator() 实现的,使得对象可以像普通函数一样被调用。
  • 仿函数对象可以存储状态(通过类的成员变量),因此可以比普通函数更加灵活。
  • 在模板编程中,仿函数经常用于策略模式(如 C++ 标准库中的排序和搜索函数)。
#include <iostream>
using namespace std;

// 定义一个仿函数类
class MyFunctor {
public:
    // 重载 operator(),使对象可以像函数一样调用
    int operator()(int x) const {
        return x * x;
    }
};

int main() {
    MyFunctor functor;  // 创建仿函数对象
    int result = functor(5);  // 使用仿函数对象像调用函数一样调用
    cout << "Result: " << result << endl;  // 输出 25
    return 0;
}

 

解释:
  • MyFunctor 是一个类,它重载了 operator(),使得类的实例 functor 可以像普通函数一样调用。
  • functor(5) 相当于调用了 functor.operator()(5),因此输出 25
使用场景:
  • 仿函数通常用于算法库(如 STL)中,它们可以携带状态,并且可以通过类的成员变量自定义函数的行为。
  • 例如,在 STL 的 sort 函数中,你可以传递仿函数作为自定义的比较器。

 

2. 虚函数(Virtual Function)

定义:

虚函数是指在基类中声明并且可以在派生类中被重写的成员函数。虚函数的主要目的是支持多态,即通过基类指针或引用调用派生类的实现。

主要特点:
  • 虚函数允许派生类重写基类的函数,从而实现多态行为。
  • 当通过基类指针或引用调用虚函数时,会根据实际指向的对象类型决定调用哪个版本的函数(动态绑定)。
  • 虚函数在基类中使用 virtual 关键字声明。
#include <iostream>
using namespace std;

// 基类
class Base {
public:
    virtual void show() {
        cout << "Base class show" << endl;
    }
};

// 派生类
class Derived : public Base {
public:
    void show() override {
        cout << "Derived class show" << endl;
    }
};

int main() {
    Base* basePtr;
    Derived derivedObj;
    basePtr = &derivedObj;
    
    // 通过基类指针调用虚函数,实际调用的是派生类的实现
    basePtr->show();  // 输出 "Derived class show"
    return 0;
}

 

解释:
  • Base 类有一个虚函数 show(),它在派生类 Derived 中被重写。
  • 通过基类指针 basePtr 指向派生类对象 derivedObj,调用 basePtr->show() 时,由于 show() 是虚函数,程序会动态决定调用 Derived 类的 show() 函数,而不是 Base 类的版本。这就是多态的实现。
使用场景:
  • 虚函数用于继承多态的场景,允许基类指针或引用调用派生类的重写版本,从而使代码更加灵活和可扩展。
  • 例如,通常在面向对象设计中,虚函数用于接口定义和派生类的具体实现。

 3. 仿函数 vs. 虚函数

 

总结:

  • 仿函数是一种让对象具备函数调用能力的机制,常用于算法库和模板编程中,适合需要在对象中保存状态的场景。
  • 虚函数是用于继承体系中的多态实现,通过基类指针或引用在运行时决定调用哪个类的函数版本,通常用于面向对象编程的多态设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值