簡體   English   中英

從基類調用成員函數

[英]Calling a member function from a base class

我正在閱讀有關委托的信息,我希望能夠根據事件使用基類調用任何函數傳遞作為參數,我是這樣做的並且可以工作,但是我不確定這是否是正確的方式以及是否像這樣的便攜式。

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

您呼叫的成員函數fnb與類的實例a ,如果你訪問類的數據承包商,客人,這將導致undefineded行為。

以此替換您的類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();
     }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM