为什么派生类中无法访问受保护的构造函数?(C++)

3

受保护成员应该可以从派生类中访问。 那么为什么在下面的代码中我收到了编译错误?

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();
}

我注意到有一个相关的帖子,但那里的类是模板类。我的只是一个“普通”类。 为什么派生类不能访问受保护的基类成员?

@EduardoPascualAseff,是的。已修复。 - leo
2个回答

7

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

类的 protected 成员仅可以被以下几种方式访问:

  1. ...
  2. 对于任何该类的派生类的成员和友元函数(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
    }
};

0

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

是的,但只有通过 this 指针访问时才可以。当您尝试构造一个新的 A 对象时,B::g() 尝试在完全不同的对象上进行访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接