c++ - 为什么 (false?A() :B()). test() 只有 A 和 B 有子类关系时才能编译?

标签 c++ inheritance syntax ternary-operator

原来我喜欢用这样的东西:

(true?a:b).test()

而不是

(true?a.test():b.test())

如果函数名称相同,为了节省打字时间,最初我认为它应该是有效的,但我发现:

#include <stdio.h>
class A{
public:
    char test(){
        return 'A';
    }
};

class B{
public:
    char test(){
        return 'B';
    }
};

int main(){
    printf("%c\n",(false?A():B()).test());
    return 0;
}

无法编译,但如果 BA 的子类:

#include <stdio.h>
class A{
public:
    char test(){
        return 'A';
    }
};

class B : public A{
public:
    char test(){
        return 'B';
    }
};

int main(){
    printf("%c\n",(false?A():B()).test());
    return 0;
}

它可以编译,为什么?

最佳答案

原因是 (test?a:b) 是一个表达式,必须有一个类型。该类型是a和b的共同类型,不相关的类型没有共同的类型。基类和派生类的共同类型是基类。

请注意,该问题包含一个假设,即编译的 only 案例是存在通用基本类型的地方。事实上,如果从一种类型到另一种类型的明确转换,它也会编译。

关于c++ - 为什么 (false?A() :B()). test() 只有 A 和 B 有子类关系时才能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31400109/

相关文章:

c++ - 即使没有焦点也想接收事件

python - 如何将字符串转换为变量以供导入? Python

syntax - "dyn"在类型中是什么意思?

c++ - msys/MinGW,即使安装了也找不到libpng,尝试编译xpdf(特别是pdftopng)

c++ - 为什么我不能用大括号括起来的初始化列表构造队列/堆栈? (C++11)

ruby - 将父类初始化的变量传递给子类的实例

C# 检查一个类是否是 X,或者是从 X 继承的

javascript - 多个语义 UI 弹出窗口,其中目标元素在每个实例的属性中定义

c++ - 什么时候需要 "typename"关键字?

具有接口(interface)的 C# MVC 通用存储库类