C++ 在C+;中传递参数时继承类之间的类型转换+;
下图显示了此问题的三个独立测试: (我只关注声明,而不是函数的定义~~) 我想知道为什么右边的人出现了一个错误“'A'是'B'的一个不可访问的基。” 为什么g++似乎通过派生类初始化对基类的引用(这会由于受保护的继承而导致错误) 而不是使用中间的转换运算符将B转换为A并传入(即0错误和0警告) 下面是图中右边的代码:C++ 在C+;中传递参数时继承类之间的类型转换+;,c++,inheritance,reference,type-conversion,C++,Inheritance,Reference,Type Conversion,下图显示了此问题的三个独立测试: (我只关注声明,而不是函数的定义~~) 我想知道为什么右边的人出现了一个错误“'A'是'B'的一个不可访问的基。” 为什么g++似乎通过派生类初始化对基类的引用(这会由于受保护的继承而导致错误) 而不是使用中间的转换运算符将B转换为A并传入(即0错误和0警告) 下面是图中右边的代码: struct A { A &operator=( const A & ) { return *this; } }a; struct B : prote
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
是使用protected
关键字从A
派生出来的,这意味着世界无法访问B
的A
子对象,因此它无法将B
转换为A
。这一切都是因为B
(即A
)的基础由于受保护的继承而无法从世界访问。将其公开
,这种转换也将在世界范围内发生
现在,这个问题:
为什么不使用用户转换函数而不是继承转换
由于继承转换优于用户定义的转换函数,因此您可以将此首选项视为第一步,第二步是可访问性规则,其中转换失败 第12.3.2节:
转换函数从不用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同对象类型(或对它的引用)、该类型的基类(可能是cv限定的)或void(可能是cv限定的)
此外,除了少数例外,选择public
/protected
/private
很少会改变程序的功能,只是程序是否有效。因此,在可能的情况下,初始化直接将引用绑定到子对象,而不是使用用户定义的转换,并且在做出该选择后,编译器检查访问。问题似乎是“为什么不使用转换运算符而不是子对象”,而不是“为什么子对象访问无效”…@aschepler:我觉得不是这样的。不管怎样,我要把它加到我的答案中。@Nawaz:谢谢!很高兴知道这是私有/受保护继承的效果,因为我一直只看到公共继承。谢谢~这个答案直接指向了我的问题~也许粗体字让纳瓦兹一开始忽略了下面的细节。。。