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

C++: Why Protected Constructor Cannot be Accessed in the Derived Class?

本文关键字:访问 受保护 构造函数 派生 为什么 C++      更新时间:2023-10-16

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

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

我注意到有一个相关的帖子,但那里的类有一个模板类。 我的只是一个"常规"类。

为什么派生类无法访问受保护的基类成员?

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

类的protected成员只能访问

  1. 成员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对象时,您正在尝试执行此操作。