我在閱讀有關委派,我想能夠在基類內調用任何函數傳遞作爲參數取決於事件,所以如果例如我有一個解析器對象,並且我想從另一個對象分配什麼方法來調用依賴找到什麼標記。我做了波紋管,它可以工作,但我不確定它是否是正確的方式,或者它是否像便攜式一樣。從C++派生類的基類中調用未定義的成員函數是否安全?
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:
};
class b : public base
{
a ob;
public:
void init()
{
//this function fn is not define neither in object "a" or "base"
//but still I can assign arbitrary member function just like I wanted
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;
}
我看到的問題是,當你通過pfn調用並輸入b :: fn()時,「this」指針將不正確。如果你試圖訪問「b」的成員,它會得到錯誤的值。我通過指針「this」指向「ob」實例來調用b :: fn()時從輸出語句中添加。這只是「這個」的副作用,並沒有真正被傳遞,並且它是從「a」類中的一個方法調用的。 –
@BrianWalker THX發現這一點,我已經完全監督這一點(類'a'被用作成員),這使得我的答案無用。總之:便攜式是的,正確的方式不! –
這是實現多態的一種相當常見的方式,不需要vtable的開銷。安全/便攜,是的......但你肯定會想評論你在做什麼,爲什麼(具體解釋你爲什麼需要避免使用虛表)。另外,當你調用函數時,不需要'this'。把它稱爲'(* fpn)();' –