模板方法模式


#include 
#include 

class AbstractClass {
public:
    void show() {
        op1();
        op2();
        op3();
        hook();
    }
protected:
    void op1() { std::cout << "In AbstractClass op1()." << std::endl; }
    virtual void op2() = 0;
    void op3() { std::cout << "In AbstractClass op3()." << std::endl; }
    virtual void hook() {};
};

class ConcreteClass1 : public AbstractClass {
protected:
    void op2() { std::cout << "In ConcreteClass1 op2()." << std::endl; }
};

class ConcreteClass2 : public AbstractClass {
protected:
    void op2() { std::cout << "In ConcreteClass2 op2()." << std::endl; }
    virtual void hook() override { std::cout << "In ConcreteClass2 hook()." << std::endl; }
};

int main(int argc, char *argv[]) {
    std::shared_ptr cc1 = std::make_shared();
    std::shared_ptr cc2 = std::make_shared();
    cc1->show();
    cc2->show();
    return 1;
}