C++装饰器模式疑问:静态调用Decorator::Operation()为何可行
为什么ConcreteDecoratorA中
Decorator::Operation()的调用能正常工作 首先要澄清一个误区:Decorator::Operation()这种写法不是静态调用,哪怕它看起来像。在C++中,当你用基类名::成员函数()的形式调用非静态成员函数时,本质是限定式成员函数调用,编译器会自动把当前对象的this指针传递给基类的成员函数,相当于this->Decorator::Operation()的简写。
结合装饰器模式的代码结构来看:
Decorator类作为基类,持有component_成员指针,它的Operation()方法里调用component_->Operation(),这里的component_实际是this->component_,依赖的是当前实例的成员。ConcreteDecoratorA继承自Decorator,在它的Operation()中写Decorator::Operation(),目的是明确调用基类的Operation实现(避免递归调用自己的重写版本),此时这个调用会使用ConcreteDecoratorA实例的this指针,自然能访问到该实例继承自Decorator的component_成员——毕竟你在构造ConcreteDecoratorA时已经通过基类构造函数初始化了component_。
举个简化的代码片段辅助理解:
class Decorator : public Component { protected: Component* component_; public: Decorator(Component* comp) : component_(comp) {} void Operation() override { component_->Operation(); // 实际访问的是this->component_ } }; class ConcreteDecoratorA : public Decorator { public: ConcreteDecoratorA(Component* comp) : Decorator(comp) {} void Operation() override { Decorator::Operation(); // 等价于this->Decorator::Operation() // 这里添加装饰器自己的额外逻辑 } };
总结一下:这种写法的核心是指定调用基类的成员函数版本,而非静态调用,所以依然能访问到当前实例的component_成员,自然可以正常工作。
内容的提问来源于stack exchange,提问作者Raffaele Lungarella
相关产品推荐
相关产品推荐

