下图显示了针对此问题的三个独立测试:
(我只关注声明而不关注函数的定义~~)
我想知道为什么正确的会得到“'A'是'B'的不可访问基数”的错误。
为什么g++似乎是由派生类初始化对基类的引用(由于 protected 继承而导致错误),
而不是使用中间的转换运算符将 B 转换为 A 并传入(即 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;
}
感谢您的帮助!~
最佳答案
当你写 a = b;
在main()
或在类之外(在世界中),然后转换发生在那里,而不是在类内部,并且可访问性规则适用于转换点(在类之外)。要进行此类转换,需要可以从外部(世界)访问基类。
在你的例子中,自 B
源自 A
使用 protected
关键字,这意味着世界无法访问A
b
的子对象,因此它无法转换 B
进入A
.这一切都是因为 B
的基础(即 A
)由于 protected
无法从世界访问遗产。制作 public
, 转换也会发生在世界上。
现在,这个问题:
Why isn't the user-conversion-function used instead of inheritance-conversion?
由于继承转换优先于用户定义的转换函数,您可以将此偏好视为第一步,第二步是可访问性规则,转换失败!
关于c++ - 在 C++ 中传递参数时继承类之间的类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14117045/