2013-12-03 77 views
0

我在阅读有关委派的内容,我希望能够使用基类调用任何函数传递作为参数,具体取决于事件,我这样做并且它可行,但我不是确定它是否是正确的方式,以及它是否像这样便携。从基类调用成员函数

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

回答

0

您与a类的一个实例,如果你访问类的数据承包商,客人,这将导致undefineded行为调用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(); 
    } 
};