【发布时间】:2014-08-29 10:46:41
【问题描述】:
派生类可以在其 ctor-initializer 中调用受保护的基类构造函数,但仅限于其自己的基类子对象,不能在其他地方调用:
class Base {
protected:
Base() {}
};
class Derived : Base {
Base b;
public:
Derived(): Base(), // OK
b() { // error
Base b2; // error
}
};
标准对此有何评论?这是[class.protected]/1:
当非静态数据时,应用超出第 11 条中所述的附加访问检查 成员或非静态成员函数是其命名类的受保护成员 (11.2) 如所述 早些时候,授予对受保护成员的访问权限是因为引用发生在某个朋友或某个成员中 类
C。如果访问要形成一个指向成员的指针 (5.3.1),则 nested-name-specifier 应表示C或 派生自C的类。所有其他访问都涉及(可能是隐式的)对象表达式(5.2.5)。在这种情况下, 对象表达式的类应为C或从C派生的类。 [ 例子: ...
调用构造函数时是否涉及对象表达式?没有,是吗?那么标准中的哪些地方描述了受保护的基类构造函数的访问控制?
【问题讨论】:
-
有趣的是,构造函数应该没有名称 [class.ctor],访问控制 不应该应用于它们;)(以及名称查找)
-
@dyp,我认为 OP 理解这种行为。他正在标准中寻找能够清楚解释这种行为的证据。您发布的链接没有任何指向标准中任何相关位置的答案,至少我没有看到任何答案。
-
@RSahu 我知道,但这并不能减少相关性/减少重复。 this 问题的答案也适用于其他问题。我没有将其作为重复项关闭,是吗?
标签: c++ oop language-lawyer