派生类无法访问基类的受保护成员

时间:2018-08-13 14:24:44

标签: c++ class inheritance protected

考虑以下示例

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;

声明为朋友,我可以访问基类的成员,在声明派生类时是否犯了一些基本错误?

2 个答案:

答案 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) {}

它确实编译没有问题。