原来我喜欢用这样的东西:
(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;
}
无法编译,但如果 B
是 A
的子类:
#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/