簡體   English   中英

當專門化基本模板類時,C ++保持對(函數參數的)受保護成員的訪問

[英]C++ keeping access to protected member (of the function argument) when specializing base template class

任何人都可以幫助解決此問題(該問題在GCC和VC ++中均持續存在)。

template <class T> class A{  
protected:  
    T a;  
public:  
    A(int aa=0){a=aa;}  
    virtual ~A(){}  
    virtual void plus(A const *AA){a=a+AA.a;}  
};  

class B:public A<int>{  
public:     
    B(int bb=0):A<int>(bb){}  
    virtual ~B(){}  
    void plus(A<int> const *AA){a=a+AA->a;} //<--PROBLEM: I can access a but not AA->A?  
};  

這是預料之中的。

B的實例無權戳入任意 A的內部; 它僅有權訪問(其他)B的A部分。 這就是protected關鍵字的含義。

這不是編譯器的問題,而是標准的一致行為。 您只能通過this (隱式或顯式)訪問基類的受保護成員。

看起來應該像這樣:

class B:public A<int>{  
public:     
    B(int bb=0):A<int>(bb){}  
    virtual ~B(){}  
    void plus(A<int> const *AA){this->A::plus(AA);}
};

如果這樣做,則無需在派生類中重新實現plus函數。

“ UncleBens”已經回答了您的主要問題,但有一些詳細信息...

第一:

virtual void plus(A const *AA){a=a+AA.a;}  

由於AA是一個指針,因此您無法執行AA.a ... ;-)

其次,請注意,成員指針通常不尊重可訪問性。 僅使用隱式轉換,您就可以訪問基類的受保護內容。 成員指針的可訪問性與流控制的goto幾乎相同。

干杯,……

–阿爾夫

暫無
暫無

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

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