如何使基类callback方法调用子类重写的process方法?
解决基类回调调用子类重写方法的问题
问题的核心原因很直接:你没有把基类的process()声明为虚函数。C++里非虚函数是静态绑定的,编译阶段就确定了要调用基类的版本,不管对象实际是子类还是基类。而虚函数才会在运行时根据对象的真实类型动态绑定,调用对应的子类重写方法。
不需要重写callback,只要修改基类的process声明,就能让基类callback自动调用子类的process,完全不用改动callback的逻辑。
具体修改步骤:
- 把基类的
process()声明为virtual虚函数,可给基类的process一个默认实现,或者设为纯虚函数(如果基类不需要实例化) - 子类重写
process时加上override关键字(可选但强烈推荐,能让编译器帮你检查是否真的匹配基类的虚函数签名,避免拼写或参数错误导致重写失效) - 子类不需要重复定义
node_id,将基类的node_id改成protected权限,子类就能直接访问,减少冗余代码 - 修正构造函数的语法错误,初始化列表后面要接函数体(哪怕是空的)
修改后的完整代码示例:
基类Node
#include <cstdint> using uint = std::uint32_t; // 确保uint类型定义有效 class Node{ protected: uint node_id; // 改为protected,子类可直接访问 public: Node(uint id) : node_id(id) {} // 实现构造函数 // callback逻辑完全不变,不需要virtual void callback(){ do_something(); // 假设这是你已实现的通用逻辑 process(); // 现在会动态绑定到子类的process } // 声明为虚函数,给默认实现;如果基类不需要实例化,可改为纯虚函数:virtual void process() = 0; virtual void process(){ // 基类默认处理逻辑(如果需要) } private: void do_something(){ // 你的通用逻辑实现 } };
子类Modified_Node
class Modified_Node: public Node{ public: // 正确的构造函数写法,复用基类构造 Modified_Node(uint id): Node(id) {} // 用override明确重写基类虚函数,编译器会检查签名匹配 void process() override { // 子类自定义的process逻辑 } };
原理说明:
当你创建Modified_Node对象并调用它的callback时,虽然callback是基类的方法,但里面调用的process是虚函数,C++会通过对象的虚表找到子类重写的版本执行,完全符合你“复用基类callback逻辑,只重写子类特定process”的设计意图。
内容的提问来源于stack exchange,提问作者Roc
相关产品推荐
相关产品推荐

