$11.2/4 个州-
N 的基类 B 可在 R 处访问,如果
- B 的一个发明的公共成员将是 N 的公共成员,或
- R 出现在 N 类的成员或朋友中,而 B 的发明公共成员将是 N 的私有或受保护成员,或
- R 出现在派生自 N 的类 P 的成员或朋友中,而 B 的发明公共成员将是 P 的私有或受保护成员,或
- 存在一个类 S,使得 B 是在 R 处可访问的 S 的基类,而 S 是在 R 处可访问的 N 的基类。”
这里'B'是'Base','N'是'Derived','R'是main。
考虑第二个项目符号-'R 出现在 N 类的成员或朋友中,......'。本条款不适用于“R”(主)既不是“N”(派生)的成员也不是朋友
考虑第三个项目符号-'R 出现在 P 类的成员或朋友中......'。由于与上述相同的原因,该条款也不适用
考虑第 4 个项目符号 - 此条款再次不适用
因此,我们可以得出结论,“Base”不是“Derived”的可访问类。
$11.2/5 个州 -
如果基类是可访问的,则可以将指向派生类的指针隐式转换为指向该基类的指针(4.10、4.11)。[注意:因此类 X 的成员和朋友可以将 X* 隐式转换为指向 X 的私有或受保护的直接基类的指针。-结束注释]
由于在 中访问时Base
不是可访问类,因此从派生类到基类的标准转换格式不正确。因此错误。Derived
main
编辑2:
研究一些流行编译器的错误消息,这应该可以帮助您更好地理解。请注意“无法访问”一词如何在所有错误消息中如此频繁且一致地弹出
参考来自标准草案 N3000。我还没有下载最新的草稿:)
GCC prog.cpp:在函数'int main()'中:prog.cpp:27:错误:'base'是'derived'的不可访问的基础</p>
Comeau Online“ComeauTest.c”,第 26 行:错误:不允许转换为无法访问的基类“base” ptr = new derived;
VS2010 错误 C2243: 'type cast' : 从 'derived *' 到 'base *' 的转换存在,但无法访问