C ++不允许基于返回类型的方法的多态性。但是,当重载隐式转换成员函数时,这似乎是可能的。
有谁知道为什么?我认为运算符的处理方式与内部方法类似。
编辑:这是一个例子:
struct func {
operator string() { return "1";}
operator int() { return 2; }
};
int main( ) {
int x = func(); // calls int version
string y = func(); // calls string version
double d = func(); // calls int version
cout << func() << endl; // calls int version
}
答案 0 :(得分:11)
转换运算符实际上并不被视为不同的重载,并且不会基于返回类型调用它们。编译器只会在必须(当类型不兼容且应该转换时)或明确要求将其中一个与强制转换运算符一起使用时使用它们。
从语义上讲,您的代码所做的是声明几个不同的类型转换运算符,不是单个运算符的重载。
答案 1 :(得分:3)
那不是返回类型。这是类型转换。
考虑:func()创建一个func类型的对象。关于调用什么方法(构造函数)没有歧义。
剩下的唯一问题是是否可以将其转换为所需的类型。您为编译器提供了适当的转换,因此很高兴。
答案 2 :(得分:1)
实际上没有技术理由可以防止结果类型上的函数过载。这在一些语言中完成,例如Ada,但在C ++的上下文中也有隐式转换(以及它们中的两种),实用程序减少了,两个功能的交互很快就会导致含糊不清。
请注意,您可以使用隐式转换是用户可定义的事实来模拟结果类型的重载:
class CallFProxy;
CallFProxy f(int);
class CallFProxy {
int myParameter;
CallFProxy(int i) : myParameter(i) {}
public:
operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};
答案 3 :(得分:0)
重载分辨率在多个候选函数之间进行选择。在这个过程中,确实没有考虑候选人的返回类型。但是,在转换运算符的情况下,“返回类型”在确定该运算符是否完全是候选者时至关重要。