【问题标题】:Calling a member function from a base class从基类调用成员函数
【发布时间】:2013-12-19 23:31:14
【问题描述】:

我正在阅读有关委派的内容,我希望能够使用基类调用任何函数作为参数传递,具体取决于事件,我这样做了并且它有效,但我不确定这是否是正确的方法和如果它像这样便携。

class base {
 public: 
     typedef void (base::*methodPTR)();
     methodPTR pfn;

    void setMethod(methodPTR fn)
    {
        pfn = fn;
    }
    void run(){
        if(pfn) (this->*pfn)();
    }
};

class a : public base {
 public:
     void fn()
     {
         cout<<"from class a!"<<endl;
     }
};

class b : public base
{
    a ob;
 public:
     void init()
     {
         ob.setMethod(static_cast<base::methodPTR>(&b::fn));
     }

     void fn()
     {
         cout << "from class b!" << endl;
     }

     void test()
     {
         ob.run();
     }
};

int _tmain(int argc, _TCHAR* argv[])
{
    b x;
    x.init();
    x.test();

    return 0;
}

【问题讨论】:

    标签: c++ pointers delegation


    【解决方案1】:

    您正在使用类 a 的实例调用类 b 的成员函数 fn,如果您访问类的数据成员,这将导致未定义的行为。

    用这个替换你的 ab 来看看魔法:

    class a : public base {
        int j;
     public:
        a()
        {
            j = 42;
        }
    
         void fn()
         {
             cout<<"from class a!"<<endl;
         }
    };
    
    class b : public base
    {
        int i;
        a ob;
     public:
         void init()
         {
             i = 5;
             ob.setMethod(static_cast<base::methodPTR>(&b::fn));
         }
    
         void fn()
         {
             cout << "from class b!" << endl;
             cout << "i = " << i << endl;
         }
    
         void test()
         {
             ob.run();
         }
    };
    

    【讨论】:

      猜你喜欢
      • 2013-06-29
      • 2017-06-19
      • 2020-12-04
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多