在C ++中,如果我想使用多态,我会创建一个父类,然后从父类派生出许多子类,然后我就可以将子类对象的地址分配给一个指针变量父类。
例如:假设我有一个名为Animal
的父类,然后我从Animal
派生了两个子类,即Dog
和Cat
,以及三个类有一个名为speak()
的方法。
现在我可以创建一个以Animal*
为参数的函数:
void foo(Animal* animal)
{
animal->speak();
}
并执行以下操作:
Cat *cat = new Cat();
Dog *dog = new Dog();
foo(cat);
foo(dog);
但是在PHP中,变量可以是任何类型,所以即使我没有父Animal
类,只有Cat
和Dog
类,我仍然可以做到以下几点:
function foo($animal)
{
$animal->speak();
}
$cat = new Cat();
$dog = new Dog();
foo($cat);
foo($dog);
当不使用父类时,它仍称为多态吗?
答案 0 :(得分:1)
您在C ++中描述的多态性是子类型(this linked Wikipedia article中三个不同含义列表中的第三个)。
这也被描述(至少在像C ++这样的静态类型语言中)作为动态多态,因为关键是"动态" (运行时)对象的类型不同于"静态"编译时类型的接口。
你在PHP中讨论的是duck typing,它本质上是参数多态的一种形式。
这大致相当于您从C ++中的模板获得的静态多态性,尽管实现方式明显不同。
答案 1 :(得分:0)
多态性是一个非常抽象的概念,特别是独立于任何特定实现。从这个意义上讲,是的,您的代码使用多态。
现在,关于你与C ++的比较,你在这里比较苹果和橘子。下面的PHP更接近于C ++代码:
function foo(Animal $animal)
{
$animal->speak();
}
另一方面,您也可以调整C ++代码:
template<typename animal_type>
void foo(animal_type& animal)
{
animal.speak();
}
请注意,我已修复了您的版本对指针的非惯用用法,但重要的是该函数现在是一个模板。