从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