从基类调用成员函数

时间:2013-12-03 18:41:48

标签: c++ pointers delegation

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

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;
}

1 个答案:

答案 0 :(得分:0)

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

用此替换您的课程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();
     }
};