考虑以下示例
class base
{
protected :
int x = 5;
int(base::*g);
};
class derived :public base
{
void declare_value();
derived();
};
void derived:: declare_value()
{
g = &base::x;
}
derived::derived()
:base()
{}
据了解,只有基类的朋友和派生类可以访问基类的受保护成员,但是在上面的示例中,出现以下错误"Error C2248 'base::x': cannot access protected member declared in class "
,但是当我添加以下行时
friend class derived;
声明为朋友,我可以访问基类的成员,在声明派生类时是否犯了一些基本错误?
答案 0 :(得分:11)
派生类只能通过派生类的上下文访问基类的protected
成员。换句话说,派生类无法通过基类访问protected
成员。
形成指向受保护成员的指针时,它必须使用派生 声明中的类:
struct Base { protected: int i; }; struct Derived : Base { void f() { // int Base::* ptr = &Base::i; // error: must name using Derived int Base::* ptr = &Derived::i; // okay } };
您可以更改
g = &base::x;
到
g = &derived::x;
答案 1 :(得分:0)
我的编译器实际上说我需要向base
添加一个非默认构造函数,因为该字段未初始化。
添加后
base() : g(&base::x) {}
它确实编译没有问题。