为什么C ++函数中的默认参数可以被认为是多态?
为什么要考虑ad-hoc多态性和通用多态性?
我认为它可以被认为是一种特殊的多态性,就像它的重载函数(?)一样,但它以什么方式通用多态?
答案 0 :(得分:1)
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多态这个词,但我认为它是 ad-hoc 因为类型的数量我们可以使用,并且您可以使用它的方式都是预先确定的。
答案 1 :(得分:1)
如果某些东西是多态的,它有很多形状。
在计算机科学中,多态性是一种 编程语言功能 允许不同数据类型的值 使用制服处理 接口
正如this链接所解释的,存在不同类型的多态性。当接口根据有限范围的单独指定的类型和组合定义不同的实现时,Ad-hoc多态性就是我们所说的。函数重载和默认参数就是一个很好的例子。
通用多态性分为参数多态(当接口是独立的类型 - 模板就是一个很好的例子)和包含多态(当一种数据类型可以被视为另一种时,即派生类可能的典型OOP多态性被视为基类)。
当谈到C ++中的默认函数参数时,ad-hoc多态性非常明显。通用多态性可能来自于您可以将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);
它也会开车。这是ad-hoc多态性。由于C ++的包含多态性,你也可以这样做:
class DieselTruck : public Car
{
// ...
};
并将其称为:
DieselTruck mytruck;
a_function("Hello Earth!", &mytruck);
它会驱动卡车(如果类正确设置,当然 - 虚拟功能和所有这些)。因此,您可以在函数中混合使用ad-hoc和通用多态。这是否是你教授的想法,我不知道。它没有直接连接到默认参数 - 也就是说,如果没有它们,你可以完全没问题,但是再一次,我看不出你如何使用仅默认参数在C ++中实现通用多态性。