C ++:为什么不能在派生类中访问受保护的构造方法?

受保护的成员应该可以从派生类访问。 然后,为什么在下面的代码中出现编译错误?

class A {
protected:
    A() {};
};

class B : public A {
public:
    void g() { 
        A a; // <--- compiling error: "Protected function A::A() is not accessible ...". Why?
    }
};


int main() {
    B b;
    b.g();
}

我注意到有一个相关的帖子,但是该类中有一个模板类。我的只是一个“普通”班。

Why the derived class cannot access protected base class members?

iCMS 回答:C ++:为什么不能在派生类中访问受保护的构造方法?

protected members可以从派生类访问,但只能通过派生类访问。

只能访问课程的protected成员

  1. ...
  2. 该类任何派生类的成员and friends (until C++17)的成员,但仅当访问受保护成员的对象的类是该派生类或该派生类的派生类时:

因此,即使在派生类的成员函数中,您也无法创建基类的独立对象。

以另一种方式放置它,则可以访问派生类的当前实例的protected个成员,但不能访问独立基类的protected个成员。例如

class A {
protected:
    int x;
public:
    A() : x(0) {}
};

class B : public A {
public:
    void g() {
        this->x = 42; // fine. access protected member through derived class
        A a;
        a.x = 42;     // error. access protected member through base class
    }
};
,

应该可以从派生类访问受保护的成员。

是,但仅当通过this指针访问时才可以。在完全独立的对象上访问时不可以。当B::g()试图构造一个新的A对象时,您要尝试做的事情。

本文链接:https://www.f2er.com/2016385.html

大家都在问