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

标签 c++ inheritance reference type-conversion

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

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

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/

相关文章:

c++ - CDHtmlDialog 将焦点设置在输入字段上

java - 如何在不创建子类和/或继承类的情况下从另一个类调用对象的方法?

C链表栈和指针

c# - Xslt 看不到程序集引用

c++ - 处理STL容器的大小

c++ - 连续数组多维表示的快速元素访问

c++ - 当打开的控制台窗口关闭时,如何防止我的程序关闭?

java - Java 中的解释性语言以及对 Java 方法的调用

java - 使用泛型实现接口(interface),两种方法具有相同的删除功能

c# - 我如何声明一个类型列表,然后再实例化一个类型?