考虑以下示例
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) {}
它确实编译没有问题。