[英]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;
}
您呼叫的成員函數fn
類b
與類的實例a
,如果你訪問類的數據承包商,客人,這將導致undefineded行為。
以此替換您的類a
和b
,以查看魔術:
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.