【发布时间】:2015-10-02 16:56:04
【问题描述】:
原来我喜欢用这样的东西:
(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方法。编译器必须确保在任何情况下返回的对象都与接口一致。 -
因为 C++ 并没有真正进行方法的动态调度(不像 python)。
-
请注意,如果
test结果没有 common_type,true?a.test():b.test()也会失败。 -
条件运算符工作的另一个有趣案例是在转换为函数指针后使用具有兼容签名的无捕获 lambda,请参阅:MSVC error when using capture-less lambda expressions as second and third operand of conditional operator
标签: c++ inheritance syntax ternary-operator