C语言中的返回类型多态性

时间:2008-10-30 04:44:08

标签: polymorphism return-type

为什么我们看不到允许返回类型中具有多态性的callables的类C语言?我可以看到附加类型推断是如何成为障碍的,但我们有plenty of languages具有完善的类型推理系统(适用于不同级别的“工作”)。

编辑:通过返回类型多态,我的意思是仅在返回类型中重载函数签名。例如,C ++和Java只允许在形式参数的类型中重载,而不是在返回类型中重载。

5 个答案:

答案 0 :(得分:16)

如果“返回类型多态”是指基于返回值类型的重载,我不确定其他语言,但对于C ++,这里的答案(几乎来自马的口):

函数返回类型不会在重载决策中发挥作用,因为Stroustrup(我假设其他C ++架构师的输入)希望重载解析为'上下文无关'。请参见“C ++编程语言,第三版”中的7.4.1 - “重载和返回类型”。

  

原因是保持分辨率   个人操作员或职能部门   调用上下文无关。

他们希望它仅基于如何调用重载 - 而不是如何使用结果(如果它被使用的话)。实际上,在不使用结果的情况下调用许多函数,或者结果将被用作更大表达式的一部分。当我们确定这一点时,我肯定会发挥作用的一个因素是,如果返回类型是解决方案的一部分,那么将会有许多调用重载函数需要使用复杂规则解决或者必须让编译器抛出这个电话不明确的错误。

而且,主知道,C ++重载分辨率足够复杂,因为它......

答案 1 :(得分:4)

我希望在某种语言中看到这个功能,不仅是因为函数foo可以返回double或int或字符串,而且foo可以返回不同类的结构或对象。消除呼叫是相当简单的 - 如果呼叫不明确,则需要强制转换来选择所需的返回类型。例如:

string s = foo();    //foo returns a string
double x = foo();    //foo returns a double
int i = foo();       //foo returns an integer
float f = (float)(int)foo();    //call the int foo and convert to float

另外

Animal a = fooFactory();    //fooFactory returns an Animal
Plant p = fooFactory();     //foofactory returns a Plant

这些情况并不经常出现,但是当他们这样做时,解决方法通常相当丑陋......

答案 2 :(得分:3)

double x = (double)foo();

如果foo()的版本可以返回double,int,float等,则上述内容不明确。

答案 3 :(得分:2)

在C ++中,您可以在很大程度上使用类来完成此操作。例如,假设我有一个数据类型,通常在输入和输出时转换为ASCII;

typedef char* pchar;

class   MyType
{
public:

 operator pchar() { return(ConvertToASCII()); }
 MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); }

 pchar ConvertToASCII();
 void ConvertFromASCII(pchar ASCII);
}

这种类型的东西经常用在C ++框架中。例如,看一下MFC CString类的实现。恕我直言,这是一个非常有用的工具,虽然在某些情况下很危险。

答案 4 :(得分:0)

由于类型的自动转换,当返回类型接近时,知道调用哪个函数并不明显。