其实早就学完了,问就是忙于科研。
在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。(百度百科)
我的理解是:多态就是为了在 继承了父类的每个子类 中 重新定义 父类中的成员函数,使每个子类中的成员函数具有多态性。
多态
动态多态要满足以下条件:
1、有继承关系
2、子类重写父类的虚函数
动态多态的使用:父类的指针或引用指向子类的对象
下面举个栗子:
先写一个Animal父类:
class Animal
{
public:
virtual void speak()//加virtual,地址不能早绑定
{
cout << "animal speak" << endl;
}
};
在成员函数speak()之前加了 virtual ,是代表定义的虚函数,这样可以在其他子类中重新定义soeak(),以实现多态性。在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) { 函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。(百度百科)
在基类的成员函数前加virtual可以防止地址早绑定,把函数体和函数调用相联系称为绑定,地址早绑定就是在编译阶段确定函数地址,这样在子类中要再次定义该成员函数就会出错,所以地址不能早绑定,而要在运行阶段绑定,成为地址晚绑定。方法就是在基类的成员函数前加virtual使其变为虚函数。
用继承的方式写两个子类:
class Cat :public Animal
{
public:
//重写:函数返回类型 函数名 参数列表 完全相同
virtual void speak()//virtual 可写可不写
{
cout << "cat speak" << endl;
}
};
class Dog :public Animal
{
public:
void speak()
{
cout << "dog speak" << endl;
}
};
可以从上面看到,Cat类和Dog类都继承了Animal类,但是又分别有其独特的成员函数speak(),这就是上面所说的多态的作用。在子类中重写成员函数时,前面可以加virtual,也可以不加。
那怎么使用多态呢,使用的方式前文已经提到ÿ