从基类调用成员函数

Calling a member function from a base class

本文关键字:函数 成员 调用 基类      更新时间:2023-10-16

我读到了关于委派的文章,我想根据事件的不同,用基类调用任意函数作为参数,我这样做了,它可以工作,但我不确定这是否是正确的方式,也不确定它是否像这样可移植。

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

您正在用类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();
     }
};