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

Derived class cannot access the protected member of the base class

本文关键字:受保护 成员 基类 访问 派生      更新时间:2023-10-16

考虑以下示例

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;

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

派生类只能通过派生类的上下文访问基类的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;

我的编译器实际上说我需要向base添加一个非默认构造函数,因为该字段未初始化。

在我添加之后

base() : g(&base::x) {}

它确实编译没有问题。