首页 > 解决方案 > 如何干净地编写我的虚函数

问题描述

我对 c++ 相当陌生,并且正在学习如何编写干净的代码。我想重写下面的derived1mngr 和derived2mngr 类中的函数manage()。这两个函数的代码是通用的,唯一的区别是用于调用代码的对象类型。我不想在derived1mngr 和derived2mngr 中复制相同的代码。有什么建议会有所帮助吗?我如何在基类管理中将代码组合在一起?

class Base{
    public:
    virtual void handle(){
        cout<< "handle base";
        ....//do something
    }
    void fn1() {...}
    .....
    void fn10() {...}
};

 class D1: public Base{
    public:
    void handle(){
        Base::handle();
        cout<< "D1 handle";
        ....//do something
    }
};
class D2: public Base{
    public:
    void handle(){
        Base::handle();
        cout<< "D2 handle";
        ....//do something
    }
};

class basemngr {
    public:
        virtual void manage() {
        }
        void callA() {....};
        void callB() {...};
};

class derived1mngr: public basemgr{
    public:
      void manage() {
          D1 d1;
          d1.handle();
          d1.fn1();
          d1.fn2();
          if ( d1.fn3()) {
              callA(); 
          }
         if ( d1.fn4()) {
              callB(); 
          }
        }
};

class derived2mgr{
    public:
          void manage() {
              D2 d2;
              d2.handle();
              d2.fn1();
              d2.fn2();
              if ( d3.fn3()) {
                  callA(); 
             }
             if ( d2.fn4()) {
                  callB(); 
             }
        }
};

int main ()
{
     basemgr* d1m = new derived1mgr();
     d1m-> manage();
}

标签: c++c++17

解决方案


沿着这些思路,也许:

class basemngr {
    public:
        virtual void manage() {
        }
        void manageImpl(Base& b) {
          b.handle();
          b.fn1();
          b.fn2();
          // ...
        }
        void callA() {....};
        void callB() {...};
};

class derived1mngr: public basemgr{
    public:
      void manage() {
          D1 d1;
          manageImpl(d1);
     }
};

推荐阅读