派生类中的静态方法可以在 C++ 中调用受保护的构造函数吗?

Posted

技术标签:

【中文标题】派生类中的静态方法可以在 C++ 中调用受保护的构造函数吗?【英文标题】:Can a static method in a derived class call a protected constructor in C++? 【发布时间】:2011-11-07 02:12:21 【问题描述】:

此代码适用于 clang,但 g++ 说:

错误:“A::A()”受到保护

class A

protected:
    A() 
;

class B : public A

    static A f()  return A();  // GCC claims this is an error
;

哪个编译器是正确的?

【问题讨论】:

【参考方案1】:

g++ 是对的。

C++ 标准 §11.5/1 规定“<...> 访问必须通过指向、引用或 派生 类本身的对象的指针 <...>” .对于构造函数,这意味着B 只允许调用A 的受保护构造函数来构造它自己的基础子对象。

检查 g++ 中的this 相关问题。它已被关闭,因为它不是错误。

【讨论】:

+1 至于基本原理,protected 提供对B 内的A 子对象的访问,而不是对任何 A 的访问。另一个例子是struct C : A static void break_invariants( B&amp; b ) b.protected_member_from_A = 5; ;,它可能可能破坏B中的不变量。 David:你这么说很有趣,因为 GCC确实 允许从派生类中的静态方法访问(修改)基类的受保护静态数据成员。你认为 是 GCC 中的一个错误吗? @Kirill:标准的那部分是否仅适用于构造函数?因为在 GCC 下似乎可以以类似的方式访问普通的命名方法和数据成员。 @John Zwinck,不,这不仅仅是关于构造函数。可能您使用静态成员或通过 this (隐式)使用普通命名方法。

以上是关于派生类中的静态方法可以在 C++ 中调用受保护的构造函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能访问静态多态派生类中的受保护成员?

访问派生类中的受保护成员

无法访问派生类中的受保护方法

打字稿:使父类中的公共方法成为派生类中的私有/受保护方法

C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

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