【问题标题】:Can a static method in a derived class call a protected constructor in C++?派生类中的静态方法可以在 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
};

哪个编译器是正确的?

【问题讨论】:

    标签: c++ static constructor compiler-errors protected


    【解决方案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 (隐式)使用普通命名方法。
    猜你喜欢
    • 2021-10-05
    • 2021-10-03
    • 2012-12-07
    • 2018-06-15
    • 2012-06-04
    • 2011-09-17
    • 2011-11-10
    • 2013-05-30
    • 2015-06-12
    相关资源
    最近更新 更多