钩子函数是在基类中定义的带有默认实现的虚函数,子类可选择性地覆盖以扩展行为。它用于模板方法模式中的可选扩展点,如条件执行或前后置操作,无需强制子类实现,提供更高灵活性。示例中shouldValidate()为钩子函数,默认返回false控制是否验证数据,子类可根据需要重写。

模板方法模式在C++中通过基类定义算法骨架,子类实现具体步骤。钩子函数是该模式中的可选虚函数,允许子类选择性地扩展行为,而不需要强制重写。
钩子函数(Hook Method)是在基类中定义的虚函数,提供默认实现,子类可以按需覆盖。它用于控制模板方法中的某些扩展点,比如条件执行、前置/后置操作等。
与抽象方法不同,钩子函数不是纯虚函数,子类无需必须实现,这使得其更具灵活性。
定义一个基类,在其中声明模板方法,并加入一个或多个钩子函数作为扩展点。
立即学习“C++免费学习笔记(深入)”;
示例代码:
class DataProcessor {
public:
// 模板方法:固定流程
void process() {
readData();
parseData();
if (shouldValidate()) { // 钩子函数调用
validateData();
}
saveData();
}
protected:
virtual void readData() = 0;
virtual void parseData() = 0;
virtual void saveData() = 0;
// 钩子函数:默认不验证
virtual bool shouldValidate() const {
return false;
}
virtual void validateData() {
std::cout << "Validating data...\n";
}
};
class FileProcessor : public DataProcessor {
protected:
void readData() override {
std::cout << "Reading from file...\n";
}
void parseData() override {
std::cout << "Parsing file content...\n";
}
void saveData() override {
std::cout << "Saving processed file...\n";
}
// 子类选择性覆盖钩子
bool shouldValidate() const override {
return true; // 启用验证步骤
}
};
钩子函数适用于需要条件分支或可选行为的模板流程。
比如添加一个后置钩子:
<pre class="brush:php;toolbar:false;">virtual void postProcess() const {
// 默认为空,子类可扩展
}
void process() {
readData();
parseData();
if (shouldValidate()) {
validateData();
}
saveData();
postProcess(); // 扩展点
}
某个子类可用来打印统计信息:
<pre class="brush:php;toolbar:false;">void postProcess() const override {
std::cout << "Processing completed at: "
<< time(nullptr) << "\n";
}
以上就是C++模板方法模式钩子函数使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号