无需继承,如何为其他类的函数扩展代码?
问题需求
现有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; }
代码说明
- 在
class1中拆分出original_foo()保存原始计数逻辑,同时用std::function类型的foo_impl作为可动态替换的逻辑入口,foo()函数仅负责调用这个入口。 class2提供enhance_foo()方法,接收class1对象指针后,将foo_impl替换为包含原始逻辑+自定义代码的新lambda表达式。- 主函数中创建对象后,通过
class2完成增强操作,最终直接调用c1.foo()即可得到预期输出。
内容的提问来源于stack exchange,提问作者DjAs
相关产品推荐
相关产品推荐

