從http://www.parashift.com/c++-faq-lite/basics-of-inheritance.html#faq-19.5如何訪問派生類中的受保護成員?
甲構件(無論數據成員或成員函數)中的一類受保護的節中聲明只能由成員函數和該類的朋友訪問,並且通過成員函數和派生類的朋友
那麼,在派生類中訪問受保護函數fun
的方法是什麼?
#include <iostream>
using namespace std;
class X
{
private:
int var;
protected:
void fun()
{
var = 10;
cout << "\nFrom X" << var;
}
};
class Y : public X
{
private:
int var;
public:
void fun()
{
var = 20;
cout << "\nFrom Y" << var;
}
void call()
{
fun();
X objX;
objX.fun();
}
};
這導致:
[email protected]:~/> g++ type.cpp
type.cpp: In member function ‘void Y::call()’:
type.cpp:9:8: error: ‘void X::fun()’ is protected
type.cpp:32:14: error: within this context
我看到了這一點:Accessing protected members in a derived class
考慮:
你只能訪問受保護的成員(或 你的類型的實例衍生從你的類型)。您無法訪問父代或表親類型的實例的受保護成員。
就你而言,Derived類只能訪問派生實例的b成員,而不是其他Base實例。
更改構造函數以獲取派生實例也將解決 的問題。
如何在不更改構造函數聲明的情況下實現這一點?
+1。是。 X :: fun()是從基類X訪問隱藏名稱的方式。不需要朋友或臨時對象。 – 2012-02-04 11:10:41
這是一個完全不同的用例。這是在'* this'上調用'X :: fun',而不是在類型'X'的對象上調用它,而不是'Y'對象的基類,這個對象正在嘗試這個問題。 – 2012-02-04 12:48:42
我不明白這可以被接受爲答案,就像@CharlesBailey說的那樣,這是一個完全不同的用例。 – Neutrino 2016-04-15 13:24:52