gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:28:07 25 4
gpt4 key购买 nike

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

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

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

我想知道为什么正确的会得到“'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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com