多态概念:
父类指针指向子类对象,通过父类指针调用子类函数,使父类指针有多种形态(调用成员函数)
条件:
1.继承
2.父类中有虚函数
3.在子类中对父类的虚函数重写
4.将子类对象赋给父类,通过父类调用虚函数 ,执行子类的函数
多态举例:
class Drink
{
public:
virtual void Show() //虚函数
{
cout << "Drink" << endl;
}
};
class Water:public Drink
{
public:
void Show()
{
cout << "水" << endl;
}
};
class Milk :public Drink
{
public:
void Show()
{
cout << "牛奶" << endl;
}
};
class Coffee :public Drink
{
public:
void Show()
{
cout << "咖啡" << endl;
}
};
int main()
{
Drink* p=new Water;
p->show();
p=new Milk;
p->show();
p=new Coffee;
p->show();
return 0;
}
虚函数
在类成员函数前面加上virtual就可以变成虚函数了(虚函数是实现多态的基本条件),为什么不用在子类中写virtual呢?那是因为子类是从父类继承过来的所以这时的成员函数就是虚函数,只需要把函数的实现部分重写就可以了。
多条实现原理
有了虚函数以后,对象占用的存储空间比没有虚函数时多了4个字节,这个多出来的4个字节就是实现多态的关键——它位于对象存储空间的最前端,其中存放的时虚函数表的地址。
每个有虚函数的类都有一个虚函数表,该类的任何对象中都放着该虚函数表的指针。虚函数表时编译器生成的,程序运行时被载入内存。一个类的虚函数表中列出了该类的全部虚函数地址。
纯虚函数和抽象类
纯虚函数的实现是virtual+函数名(函数参数)=0;纯虚函数没有函数体,只有声明,有纯虚函数的类称之为抽象类。什么会说是抽象类呢,因为纯虚函数没有函数体,不是完整的函数,无法调用,也没法为其分配内存空间。
#include<iostream>
using namespace std;
class CPerson
{
public:
virtual void Eat()=0;
}
class CChnia:public CPerson
{
public:
void Eat()
{
cout<<"筷子"<<endl;
}
}
int main()
{
CPerson* pCh=new CChnia;
pCh->Eat();
return 0;
}