2011-11-20 54 views
0

當定義一個指向從基類私有繼承的函數的成員函數指針時,你會如何聲明它?定義一個私人繼承函數的成員函數指針

如..

// class B defined here 

class A; //forward dec 

typedef void (B::*fnc_ptr)(); // This? or.. 
typedef void (A::*fnc_ptr)(); // this...? 

class A: private B{ 
    public: 
     A(): ptr(0){}; 
     ~A(){}; 

     using B::fnc; 

     void setandcall(){ 
      ptr = &fnc; 
      (*ptr)(); 
     } 

     fnc_ptr ptr; 
}; 

回答

1

您還沒有連接你所得到的錯誤。我認爲你的真實錯誤可能是

typedef (B::*fnc_ptr)(); // This? or.. 
typedef (A::*fnc_ptr)(); // this...? 

你的選擇沒有指定返回類型。

說這兩個你的構造將工作。你的問題是當你調用一個非靜態成員函數時,你需要通過這個參數。私人繼承僅影響A而非A本身的消費者。

class B 
{ 
public: 
    void fnc(); 

}; 


typedef void (B::*fnc_ptr)(); // This? or.. 

class A: private B{ 



    public: 
     A(): ptr(0){}; 
     ~A(){}; 


     void setandcall(){ 
      ptr = &B::fnc; 
      (this->*fnc)(); 
     } 

     fnc_ptr ptr; 
}; 
+0

沒有返回類型是一個錯字 - 它現在編輯。我沒有編譯它,我只是想知道我應該在這種情況下做什麼? – user965369

+0

'this-> fnc()'應該是'(this - > * fnc)()'。 –

+0

@Charles更新了答案 –

1

沒關係。但是,當您形成指向成員的指針時,您必須明確指定&A::fnc&B::fnc&fnc無效。

如果fncB繼承然後&A::fnc具有類型void (B::*)()但它是安全的轉換爲void (A::*)()作爲基類操作可以在派生類的一個實例安全操作的功能。換言之,另一種方式是不安全的。顯然,轉換將可以使用指向成員的指針的類範圍限制爲僅派生類類型的對象。

此外,當你給它打電話時,你需要使用->*.*運營商。 (*ptr)()無效。例如。 (this->*ptr)()