【问题标题】:Default arguments in function and polymorphism [closed]函数和多态中的默认参数 [关闭]
【发布时间】:2011-01-09 11:17:29
【问题描述】:
  1. 为什么 C++ 函数中的默认参数可以被视为多态?

  2. 为什么要考虑ad-hoc多态和通用多态?

我认为它可以被视为一种特殊的多态性,就像它的重载函数(?)一样,但是它以什么方式是通用的多态性呢?

【问题讨论】:

  • 很多词...对于 C/C++ 功能之一,我使用较少。
  • 什么是ad-hoc polymorphismuniversal polymorphism?从来没有听说过!
  • @Nawaz:我用 Google 搜索过,我发现了这样的东西:stason.org/TULARC/software/object-oriented-programming/…... 但是不,我也从未听说过!
  • 对我来说闻起来像家庭作业,这个问题太流行了,不能成为一个真正的问题。
  • @Oli:这就是为什么我说它是理论上的。我知道这两个术语,但仍然不明白为什么它可以被视为通用多态性。

标签: c++ polymorphism


【解决方案1】:

如果某物是多态的,它就有许多形状。

在计算机科学中,多态性是 编程语言功能 允许不同数据类型的值 使用制服处理 界面。

正如this 链接所解释的,有不同类型的多态性。当接口根据单独指定的类型和组合的有限范围定义不同的实现时,我们称之为 Ad-hoc 多态性。函数重载和默认参数就是一个很好的例子。

通用多态分为参数多态(当接口与类型无关时——模板就是一个很好的例子)和包含多态(当一种数据类型可以被视为另一种时,即派生类可能的典型 OOP 多态)被视为基类)。

当谈到 C++ 中的默认函数参数时,即席多态性非常明显。通用多态性可能来自于您可以将 C++ 的包含多态特性与函数参数一起使用:

void a_function (const char* print_me, Car* pCar = NULL)
{
    std::cout << print_me << std::endl;
    if(pCar)
        pCar->Drive();
} 

现在,我们可以这样调用函数:

a_function("Hello World!");

它会简单地打印“Hello World!”,或者我们可以这样称呼它:

Car mycar;
a_function("Hello World!", &mycar);

它也可以驱动汽车。那就是临时多态性。由于 C++ 的包含多态性,您也可以这样做:

class DieselTruck : public Car
{
     // ...
};

然后这样称呼它:

DieselTruck mytruck;
a_function("Hello Earth!", &mytruck);

它会驱动卡车(当然,如果课程设置正确 - 虚拟功能等等)。因此,您可以通过这种方式在函数中混合临时多态性和通用多态性。这是否是你的教授的想法,我不知道。它不直接连接到默认参数——也就是说,没有它们你可以很好地做到这一点,但话又说回来,我看不出你如何使用 only 默认参数在 C++ 中实现通用多态性。

【讨论】:

  • 非常感谢!我也有一种感觉,它与包含多态性有关。再次,非常感谢 - 很好的解释。
【解决方案2】:

1) 它可以被认为是多态性,因为您有效地提供了调用同一函数的不同方式。考虑:

int func(int a = 1, int b = 2, int c = 3, int d = 4);

我可以这样称呼它:

func();
func(5);
func(5, 6);
func(5, 6, 7);
func(5, 6, 7, 8);

这样,如果我们提供这 5 种不同的方法而没有任何默认参数,它类似于函数重载:

int func();
int func(int a);
int func(int a, int b);
int func(int a, int b, int c);
int func(int a, int b, int c, int d);

2) 我也直到今天才遇到ad-hoc polymorphism这个词,但我认为它是ad-hoc,因为类型的数量我们可以使用,而您可以使用它的方式数量都是预先确定的。

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2014-08-02
    • 2010-09-16
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多