类型转换++
问题描述:
下面的图片示出了针对此问题三个独立测试:类型转换++
(I只着眼于声明但功能不定义~~)
我想知道为什么正确的一个出现“'A'错误是'B''无法访问的基础。
为什么对于g ++似乎初始化由派生类的参考基础(这导致错误,由于保护继承)
而不是像中间的一个用转换算到B转换为甲并通过(这是0错误和0警告)?
这里是正确的图片中的代码:
struct A {
A &operator=(const A &) { return *this; }
}a;
struct B : protected A {
operator A() { return A(); };
}b;
int main(void)
{
a = b;
return 0;
}
感谢您的帮助〜
答
第12.3.2节:
A转换函数从不用于(可能CV修饰)对象转换为(可能CV修饰)相同的对象类型(或对它的引用),到一个(可能是cv合格的)该类型的基类(或对其的引用),或者(可能是cv合格的)void。
此外,除少数例外,public
/protected
/private
的选择很少改变一个程序做什么,程序公正是有效还是无效。因此,初始化会尽可能直接绑定对子对象的引用,而不是使用用户定义的转换,并且在做出选择之后,编译器检查访问权限。
答
当你写在main()
或类之外a = b;
(世界)那么转换发生在那里,而不是在类内部,并且可访问性规则适用于转换点(这是在类之外)。要进行这种转换,基类需要从外部(世界)访问。
在你的情况下,由于B
从A
使用protected
关键字,这意味着世界将无法访问的b
A
子对象,因为其中它不能转换成B
衍生A
。这一切发生是因为B
(即A
)的基数由于protected
继承而无法从世界访问。使其成为public
,转换也将在全球发生。
现在,这个问题:
为什么不使用的,而不是继承的转换的用户转换功能?
由于继承转换优于用户定义的转换功能,你能想到的这种偏好作为第一步,第二步是无障碍的规则,即转换失败!
谢谢〜这个回答直接指向我的问题〜也许大胆的角色让纳瓦兹首先忽略了下面的细节...... –