-
定义
(1)一般而言 在派生类对象使用基类的方法,而未做任何修改。
(2)然而,可能会遇到这样的情况,即希望同一个方法在派生类和基类中的行为是不同的。
(3)换句话来说,方法的行为应取决于调用该方法的对象。这种较复杂的行为称为多态—具有多种形态。
总结:
• C++中所谓的多态((Polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一个行为会作出不同响应。
• C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 -
多态形成条件
(1) 首先要有继承,并且父类中有虚函数
(2) 子类要重写(覆写–override)父类的虚函数
(3) 子类对象的地址赋值给基类的指针,通过父类的指针( 父类引用)指向子类对象,调用虚函数 -
作用(多态的意义):
- 能增加程序的灵活性、程序的可扩展性:
在程序运行过程中展现出动态的特性,在程序实际运行后才能确定具体的函数调用 - 多态是面向对象组件化程序设计的基础特性:
设计模式中绝大多数模式都和多态相关 - 可以减轻系统升级,维护,调试的工作量和复杂度,大大增强。
- demo
/*
简而言之,多态条件:
【1】父类中有虚函数
【2】子类继承父类
【3】子类重写虚函数
【4】通过父类指针(引用)调用虚函数
*/
class A
{
public:
virtual void test()//多态条件:父类中有虚函数
{
}
};
class B :public A //多态条件:有继承
{
public:
//多态条件:重写虚函数
virtual void test()
{
cout << "B::test" <<" "<<"class B :public A: Bvirtual"<< endl;
}
};
class C :public B
{
public:
virtual void test()
{
cout << "C::test" << endl;
}
};
//多态条件:子类对象的地址赋值给基类的指针,通过父类的指针,调用虚函数
void test_fun(A* ps)//A*指针
{
ps->test();
}
int main(int argc, char *argv[])
{
B b;
test_fun(&b); //B::test class B :public A: Bvirtual
C c;
test_fun(&c); //C::test
return 0;
}
- 知识扩展
5.1赋值兼容
赋值兼容是指,在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。只有在公有派生类中才有赋值兼容,赋值兼容是一种默认的行为,不需要任何显示的转换步骤。
• 派生类对象可以赋值给基类对象
• 派生类对象可以初始化基类的引用
• 派生类对象的地址可以赋值给指向基类的指针
5.2 静多态(静态联编)
对于多态,在C++中有两种情况,
(1)静多态。函数重载(overload)其实就是一种多态的表现,同一个函数名,表现出不同的形态。由于函数重载的底层实现是命名倾轧(NameMangling)技术,但是它发生在编译阶段,所以我们把这种多态称为静多态
(2)动多态。我们讲的多态,是发生在程序运行阶段,称之为动多态,也叫多态。