多态性是面向对象程序设计的关键技术之一。若程序设计语言不支持多态性,不能称为面向对象的语言。利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能。
在C++中有两种多态性
1.编译时的多态性
通过函数的重载和运算符的重载来实现的。
运行时的多态性
2.运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪一个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的。目的也是建立一种通用的程序。通用性是程序追求的主要目标之一。
概念一,虚函数
虚函数定义:virtual 返回类型 函数名(参数列表)。virtual仅用于类定义中,如果虚函数在类外实现,不可加virtual,只需要在定义处加virtual即可
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
virtual void show();
void show(int a) { cout << "A类带参show(int a)" << endl; }
int y;
};
void A::show() {
cout << "A类无参show()" << endl;
}
class B : public A
{
private:
int y;
public:
void show() { cout << "B类无参show()" << endl; }
};
int main()
{
B b;
b.show();
//当B类中出现A类中同名的show函数之后,A类中的有参无参show函数都会被屏蔽,叫同名隐藏
A *pa; //2.父类指针
pa = &b; //把子类地址赋值给父类指针
pa->show(); //在父类void show()函数前加入virtual 就可以访问子类的show()函数
pa->y = 0;
A &c = b;//3.派生类可以给父类的引用初始化
c.show();//此时也调用了子类的show()函数
c.y = 1;
//这种现象叫多态,看似是调用了父类,实际是调用了子类,同一种事物的多重形态,叫多态
return 0;
}
要先实现多态必须满足三个条件
第一、这种关系是继承
第二、需要同名函数和virtual关键字
第三、需要通过父类的指针或者引用实现
虚函数的遗传性
#include <iostream>
using namespace std;
class A
{
private:
int x;
public:
virtual void show();
void show(int a) { cout << "A类带参show(int a)" << endl; }
};
void A::show() {
cout << "A类无参show()" << endl;
}
class B : public A
{
private:
int y;
public:
void show() { cout << "B类无参show()" << endl; }//重写父类的虚方法
void show(int a) { cout << "B类带参show(int a)" << endl; }
};
class C : public B
{
private:
int z;
public:
void show() { cout << "C类无参show()" << endl; }
void show(int a) { cout << "C类带参show(int a)" << endl; }
};
int main()
{
C c;
B *pb;
pb = &c;
pb->show();
pb->show(1);
//B继承A,C继承B,此时show仍为虚拟函数
return 0;
}