一.什么是多态?
C++是一种面向对象的语言,其三种基本特征为:封装,继承和多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!本片文章主要解释了三大特性中的多态。
多态是面向对象程序设计的一个重要特征。利用多态性可以设计和实现一个易于扩展的系统。多态就是一个事物有多重状态,在C++程序设计中,多态性是指具有不同功能的函数可以用一个函数名,这样就可以用同一个函数名实现不同的功能。
从对象的类型来看,多态又被分为静态动态和动态多态。
静态多态:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用的那个函数,如果有相对应的函数就调用该函数,否则出现编译错误。
动态多态:在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法。因此动态多态又称为运行时多态。
动态多态和虚函数主要研究的是:当一个基类被继承为不同的派生类时, 各派生类可以使用与基类成员相同的成员名,如果在运行时用同一个成员名调用类对象的成员,那么会调用哪一个对象的成员?也就是,通过继承而产生了相关的不同派生类,与基类成员同名的成员在不同的派生类中有不同的含义。即“一个接口,多个方法”。
二.多态的实现
多态成立的三个条件
1 要有继承
2 要有函数重写->虚函数
3 要有父类指针(父类引用)指向子类对象
重载、重写、多态
函数重载
必须在同一个类中进行
子类无法重载父类的函数,父类同名函数将被名称覆盖
重载是在编译期间根据参数类型和个数决定函数调用
函数重写
必须发生于父类与子类之间
并且父类与子类中的函数必须有完全相同的原型
使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义)
多态是在运行期间根据具体对象的类型决定函数调用
虚函数:
class Base
{
public:
virtual void FunTest1()
{
cout << "Base::FunTest1" << endl;
}
};
class Drived :public Base
{
public:
virtual void FunTest1()
{
cout << "Drived::FunTest1" << endl;
}
};
void FunTest()
{
Base b;
Drived d;
Base &rd = d;
d.FunTest1();
b.FunTest1();
rd.FunTest1();
}
int main()
{
FunTest();
system("pause");
return 0;
}
测试结果:
Drived::FunTest1
Base::FunTest1
Drived::FunTest1
虚函数使用方法: