You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需继承,如何为其他类的函数扩展代码?

问题需求

现有class1类,其foo()函数原本执行计数到3的逻辑。需要通过与class1无关联的class2类,在不使用继承的前提下,修改class1的foo()函数,使其在执行原有计数逻辑的同时,新增执行自定义代码,且最终仅通过class1调用foo()即可触发完整逻辑。

原示例代码(存在问题)

#include <iostream>
using namespace std;

class class1 {
public:
    class1()
    {
        
    }
    void foo()
    {
        for(int i =0;i<2;i++)
        {cout << i << endl;}
    }
};

class class2 {
public:
    class2()
    {
       
    }
    void foo() override
    {
       Super::foo();
       cout << "Jump from a cliff" << endl;
    }

};

int main()
{   
    class1 c1 = class1();
    class2 c2 = class2();
    c1.foo();
    return 0;
}

注意:原示例代码存在多处错误:override关键字仅用于重写虚函数,但class2并未继承任何类;C++中无Super::foo()这类语法;且class1的foo()循环仅输出0、1,与预期输出的0、1、2不符。

预期输出

0
1
2
Jump From a cliff

可行实现方案

由于C++中普通非虚成员函数无法直接被外部类修改,我们可以通过将class1的foo()逻辑抽离为可替换的函数指针,让class2来替换这个指针,从而实现增强逻辑。具体代码如下:

#include <iostream>
#include <functional>
using namespace std;

class class1 {
public:
    // 保存原始的计数逻辑
    void original_foo() {
        for(int i = 0; i < 3; i++) { // 修正循环条件以输出0、1、2
            cout << i << endl;
        }
    }

    // 用可替换的函数对象作为逻辑入口
    function<void(class1*)> foo_impl = [this](class1* self) {
        self->original_foo();
    };

    void foo() {
        foo_impl(this);
    }
};

class class2 {
public:
    // 增强class1的foo逻辑
    void enhance_foo(class1* c1) {
        // 保留原始逻辑的副本
        auto original_impl = c1->foo_impl;
        // 替换为包含原始逻辑+自定义代码的新逻辑
        c1->foo_impl = [original_impl](class1* self) {
            original_impl(self); // 执行原计数逻辑
            cout << "Jump From a cliff" << endl; // 新增自定义代码
        };
    }
};

int main() {
    class1 c1;
    class2 c2;
    // 通过class2增强class1的foo逻辑
    c2.enhance_foo(&c1);
    // 调用class1的foo,触发增强后的完整逻辑
    c1.foo();
    return 0;
}

代码说明

  1. 在class1中拆分出original_foo()保存原始计数逻辑,同时用std::function类型的foo_impl作为可动态替换的逻辑入口,foo()函数仅负责调用这个入口。
  2. class2提供enhance_foo()方法,接收class1对象指针后,将foo_impl替换为包含原始逻辑+自定义代码的新lambda表达式。
  3. 主函数中创建对象后,通过class2完成增强操作,最终直接调用c1.foo()即可得到预期输出。

内容的提问来源于stack exchange,提问作者DjAs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:45:46