如何优化C++中派生类对基类reset功能的扩展实现?
优化C++重置功能的类设计
现有设计与问题
现有一套带重置功能的C++类体系:基类Base实现所有派生类通用的重置逻辑resetBase,派生类需实现专属重置逻辑。但当前设计存在两处缺陷:
- 对象销毁时仅调用
resetBase,无法自动触发派生类的专属重置逻辑 - 每个新派生类必须手动在自身
reset函数中调用resetBase,容易因遗漏导致逻辑不完整
现有代码
#include <iostream> class Base { public: Base(){} virtual ~Base() { std::cerr << __FUNCTION__ << std::endl; resetBase(); } virtual void reset() = 0; protected: void resetBase() { // 所有派生类通用的重置操作 std::cerr << "Base::" << __FUNCTION__ << std::endl; } }; class A : public Base { public: A(){} ~A() { std::cerr << __FUNCTION__ << std::endl; } void reset() override { resetBase(); std::cerr << "A::" << __FUNCTION__ << std::endl; // 派生类A专属的重置操作 mValueA = -1; } private: int mValueA = 0; }; int main() { Base* a = new A{}; a->reset(); delete a; }
程序输出
Base::resetBase A::reset ~A ~Base Base::resetBase
优化方案:模板方法模式
采用模板方法模式重构基类逻辑,让基类控制重置流程的骨架,派生类仅需实现自身专属的重置步骤,同时解决销毁时的自动重置问题。
修改后的代码
#include <iostream> class Base { public: Base(){} virtual ~Base() { std::cerr << __FUNCTION__ << std::endl; reset(); // 析构时调用完整的重置流程 } // 非虚函数,固定重置流程:先执行通用逻辑,再执行派生类专属逻辑 void reset() { resetBase(); resetDerived(); } protected: void resetBase() { // 所有派生类通用的重置操作 std::cerr << "Base::" << __FUNCTION__ << std::endl; } // 纯虚函数,派生类必须实现自身专属的重置逻辑 virtual void resetDerived() = 0; }; class A : public Base { public: A(){} ~A() { std::cerr << __FUNCTION__ << std::endl; } protected: void resetDerived() override { std::cerr << "A::" << __FUNCTION__ << std::endl; // 派生类A专属的重置操作 mValueA = -1; } private: int mValueA = 0; }; int main() { Base* a = new A{}; a->reset(); delete a; }
优化后输出
Base::resetBase A::resetDerived ~A ~Base Base::resetBase A::resetDerived
方案优势
- 自动执行通用逻辑:基类的
reset函数固定调用resetBase,派生类无需手动调用,避免遗漏 - 销毁时自动触发完整重置:析构函数调用
reset,会依次执行通用重置和派生类专属重置,保证对象销毁前完成完整的重置操作 - 职责分离:基类负责流程控制和通用逻辑,派生类仅需专注于自身特定的重置逻辑,代码更清晰、易维护
内容的提问来源于stack exchange,提问作者Käseknacker
相关产品推荐
相关产品推荐

