簡體   English   中英

無法使用朋友類從基類訪問私有成員

[英]Cannot access private members from base class using friend classes

這是我的代碼:

class Base
{
    friend class SubClass;
    int n;
    virtual int getN()
    {
        return n;
    }
};

class SubClass: public Base
{
public:
    SubClass() {}
    SubClass(const SubClass& s) {}


};

int _tmain(int argc, _TCHAR* argv[])
{
    SubClass s;
    int x = s.getN();

    return 0;
}


error C2248: 'Base::getN' : cannot access private member declared in class 'Base'

要從Base訪問我的私人成員,我還需要做什么?

您的friend聲明意味着SubClass可以SubClass范圍內訪問它。

如果要讓類的用戶訪問某些內容,則有時需要編寫public:函數:

class SubClass : public Base
{
public:
    int getN()
    {
        return Base::getN();
    }
};

您可以編寫using聲明,將基類函數帶入當前類:

class SubClass : public Base
{
public:
    // getN is considered declared at this point now (in public)
    using Base::getN(); 
};

為什么不將n聲明為protected呢?

main的代碼不是試圖訪問SubClass方法,而是試圖訪問Base方法-這就是為什么它不起作用的原因。

嘗試在SubClass添加替代:

virtual int getN()
{
    return Base::getN();
}

getN()從未公開,因此tmain()不能調用它。

無論如何,讓子類成為基類的朋友不是正確的方法。 這是類型系統的一個令人困惑的顛覆。 如果要從子類訪問基類的非公共成員,但又不公開它們,則將其保護。

暫無
暫無

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

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