类型转换++

问题描述:

下面的图片示出了针对此问题三个独立测试:类型转换++

(I只着眼于声明但功能不定义~~)

http://i.stack.imgur.com/wYtA6.png

我想知道为什么正确的一个出现“'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的选择很少改变一个程序做什么,程序公正是有效还是无效。因此,初始化会尽可能直接绑定对子对象的引用,而不是使用用户定义的转换,并且在做出选择之后,编译器检查访问权限。

+0

谢谢〜这个回答直接指向我的问题〜也许大胆的角色让纳瓦兹首先忽略了下面的细节...... –

当你写在main()或类之外a = b;(世界)那么转换发生在那里,而不是在类内部,并且可访问性规则适用于转换点(这是在类之外)。要进行这种转换,基类需要从外部(世界)访问。

在你的情况下,由于BA使用protected关键字,这意味着世界将无法访问的bA子对象,因为其中它不能转换成B衍生A。这一切发生是因为B(即A)的基数由于protected继承而无法从世界访问。使其成为public,转换也将在全球发生。

现在,这个问题:

为什么不使用的,而不是继承的转换的用户转换功能?

由于继承转换优于用户定义的转换功能,你能想到的这种偏好作为第一步,第二步是无障碍的规​​则,即转换失败!

+0

问题似乎是“为什么不是使用转换操作符而不是子对象”,而不是“为什么子对象访问无效”...... – aschepler

+0

@aschepler:那对我来说似乎没有。无论如何,要加入我的答案。 – Nawaz

+1

@Nawaz:谢谢!很高兴知道这是私有/受保护继承的效果,因为我一直只看到公有继承。 – legends2k