Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中传递参数时继承类之间的类型转换+;_C++_Inheritance_Reference_Type Conversion - Fatal编程技术网

C++ 在C+;中传递参数时继承类之间的类型转换+;

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

下图显示了此问题的三个独立测试:

(我只关注声明,而不是函数的定义~~)

我想知道为什么右边的人出现了一个错误“'A'是'B'的一个不可访问的基。”

为什么g++似乎通过派生类初始化对基类的引用(这会由于受保护的继承而导致错误)

而不是使用中间的转换运算符将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=bmain()
中或类外部(在世界上),则转换发生在那里,而不是在类内部,并且可访问性规则应用于转换点(在类外部)。为了进行这种转换,基类需要能够从外部(世界)访问

在您的例子中,由于
B
是使用
protected
关键字从
A
派生出来的,这意味着世界无法访问
B
A
子对象,因此它无法将
B
转换为
A
。这一切都是因为
B
(即
A
)的基础由于
受保护的继承而无法从世界访问。将其公开
,这种转换也将在世界范围内发生

现在,这个问题:

为什么不使用用户转换函数而不是继承转换

由于继承转换优于用户定义的转换函数,因此您可以将此首选项视为第一步,第二步是可访问性规则,其中转换失败

第12.3.2节:

转换函数从不用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同对象类型(或对它的引用)、该类型的基类(可能是cv限定的)或void(可能是cv限定的)


此外,除了少数例外,选择
public
/
protected
/
private
很少会改变程序的功能,只是程序是否有效。因此,在可能的情况下,初始化直接将引用绑定到子对象,而不是使用用户定义的转换,并且在做出该选择后,编译器检查访问。

问题似乎是“为什么不使用转换运算符而不是子对象”,而不是“为什么子对象访问无效”…@aschepler:我觉得不是这样的。不管怎样,我要把它加到我的答案中。@Nawaz:谢谢!很高兴知道这是私有/受保护继承的效果,因为我一直只看到公共继承。谢谢~这个答案直接指向了我的问题~也许粗体字让纳瓦兹一开始忽略了下面的细节。。。