派生类中的静态方法可以在 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& b ) b.protected_member_from_A = 5; ;
,它可能可能破坏B
中的不变量。
David:你这么说很有趣,因为 GCC确实 允许从派生类中的静态方法访问(修改)基类的受保护静态数据成员。你认为 那 是 GCC 中的一个错误吗?
@Kirill:标准的那部分是否仅适用于构造函数?因为在 GCC 下似乎可以以类似的方式访问普通的命名方法和数据成员。
@John Zwinck,不,这不仅仅是关于构造函数。可能您使用静态成员或通过 this (隐式)使用普通命名方法。以上是关于派生类中的静态方法可以在 C++ 中调用受保护的构造函数吗?的主要内容,如果未能解决你的问题,请参考以下文章