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

Posted

技术标签:

【中文标题】类 C 语言中的返回类型多态性【英文标题】:Return type polymorphism in C-like languages 【发布时间】:2010-09-19 22:36:57 【问题描述】:

为什么我们没有看到允许在返回类型中具有多态性的可调用对象的类 C 语言?我可以看到额外的类型推断将如何成为一个障碍,但我们有 plenty of languages 具有成熟的类型推断系统(适用于不同级别的“工作”)。

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

【问题讨论】:

类型推断将包含在 C++0x 中,与您建议的返回类型多态性不同。 【参考方案1】:

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

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

原因是为了保持分辨率 单个运算符或函数 调用上下文无关。

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

而且,天知道,C++ 重载解析就目前而言已经足够复杂了......

【讨论】:

没错,任何执行此操作的函数在 void 上下文中都会有未定义的行为 -- 除非存在重载的 void 返回类型。【参考方案2】:

我希望在某些语言中看到这个特性,不仅让函数 foo 可以返回一个双精度值或一个整数或一个字符串,而且让 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

这些情况并不经常出现,但当它们出现时,解决方法通常相当难看......

【讨论】:

在这种情况下,我们应该禁止未分配的调用或至少有类似 (Plant)fooFactory()【参考方案3】:
double x = (double)foo();

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

【讨论】:

是但字符串 s = foo();双 x = foo(); int i = foo();不模棱两可。如果 foo 已经返回了双精度值,为什么我要将 foo 的返回类型转换为双精度值?如果没有版本的 foo 返回一个 double 则(第一个)强制转换应该匹配重载的返回类型......【参考方案4】:

在 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 类的实现。恕我直言,这是一个非常有用的工具,尽管在某些情况下很危险。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于类 C 语言中的返回类型多态性的主要内容,如果未能解决你的问题,请参考以下文章

c++中为啥要用new 函数()实现多态?

C++课程设计 多态性及实现的程序

重载的编程语言中的重载

深入类和对象

C中的继承和多态

C++ 静态多态性 (CRTP) 和使用派生类的 typedef