在同名覆盖引发的问题中,父类对象指向子类对象直接将其退化为父类对象,导致没有达到函数重写期望的结果,那么程序怎样根据实际的对象类型判断如何调用重写函数了,c++中的多态就可以解决该问题
c++语言直接 支持多态:
通过virtual关键字来进行支持,被virtual声明的函数叫做虚函数
多态的概念:
静态联编: 在程序的编译期间就能够确定具体的函数调用,如:函数重载
动态联编:在程序的实际运行后才能确定具体的函数调用 如:函数重写 (多态,工程中函数重写必须多态实现,否则没有意义)
多态的意义:
1.在程序运行过程中,展现出现在的特性
2.函数重写必须多态实现,否则没有意义
3.多态是面向对象组件化程序设计的基础特性,设计模式中大部分就需用到多态的特性
函数重载,函数重写和函数覆盖的区别:
1.函数重载发生在相同作用域
2.函数重写发生在父类与子类之间存在继承关系(工程中需用多态实现)
3.函数覆盖发生在父类和子类之间,子类的函数名与父类函数名同名则父子函数之间存在函数覆盖;
下面通过一个例子来加深理解:
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
virtual void func()
{
cout << "void func()" << endl;
}
virtual void func(int i)
{
cout << "void func(int i) : " << i << endl;
}
virtual void func(int i, int j)
{
cout << "void func(int i, int j) : " << "(" << i << ", " << j << ")" << endl;
}
};
class Child : public Parent
{
public:
void func(int i, int j)
{
cout << "void func(int i, int j) : " << i + j << endl;
}
void func(int i, int j, int k) // 函数覆盖
{
cout << "void func(int i, int j, int k) : " << i + j + k << endl;
}
};
void run(Parent* p)
{
p->func(1, 2); // 展现多态的特性
// 动态联编
}
int main()
{
Parent p;
p.func(); // 静态联编
p.func(1); // 静态联编
p.func(1, 2); // 静态联编
cout << endl;
Child c;
c.func(1, 2); // 静态联编
cout << endl;
run(&p);
run(&c);
return 0;
}