①多态:借助虚函数,基类指针既可以使用基类(父类)的成员函数,也可以使用派生类(子类)的成员函数,它有多种形态,或多种表现方式,这就是多态 简单说就是同一条语句可以执行不同的操作,看起来有不同表现方式,这就是多态。
构成多态的条件
多态存在的三个条件:- 必须存在继承关系;
- 继承关系中必须有同名的虚函数,并且它们是覆盖关系(重载不行)。
- 存在基类的指针,通过该指针调用虚函数。
注意:派生类(子类)中的虚函数必须覆盖(不是重载)基类(父类)中的虚函数,才能通过基类指针访问
1:创建类,定义虚函数 定义: 关键字:virtual 类型 名字(){} 虚函数对于多态具有决定性的作用,有虚函数才能构成多态
) virtual 关键字仅用于函数声明,如果函数是在类外定义,则不需要再加上virtual关键字。
所有派生类中具有覆盖关系的同名函数都将自动成为虚函数。
通过指针指向或者引用 在C++中,虚函数的唯一用处就是构成多态。
3:创建类的两种方式:
动态创建:1:base *p=new base()
p->函数
2: p1=new 子类名
p1->子类函数 可以在多个类中使用,重载只能在一个类中使用
和重载函数的 区别:虚函数不能被修改参数和返回类型,而且参数和返回类型一致,②:纯虚函数的定义方式:virtual void showme(参数列表)=0;
纯虚函数没有函数体,只有函数声明,在虚函数声明结尾加上=0
,表明此函数为纯虚函数。
最后的=0
并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。
默认为抽象类,不允许创建对象,原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。和类有本质的区别:
) 只有类中的虚函数才能被声明为纯虚成员函数,普通成员函数和顶层函数均不能声明为纯虚函数,定义了抽象函数,则这个类就会变成抽象类
共同特征:实现多态,
如何使用:声明为纯虚函数,在派生类中实现#ifndef __TEST_H_ 作用:声明函数的唯一性
#define __TEST_H_简单的使用虚函数和纯虚函数:
//多态 虚函数,纯虚函数<strong>#include<iostream> using namespace std; class std1{ public: virtual void my(){ //虚函数 cout<<"sanzhixiong"<<endl; } virtual void my1()=0; //纯虚函数 创建纯虚函数时就会将这个类变成抽象类 }; class std2:public std1{ public: void my(){ cout<<"狗"<<endl; //覆盖父类的虚函数,但是虚函数的结果不会改变,在main函数中依然可以使用 } void my1(){ cout<<"dashab8"<<endl; //只能在派生类中使用纯虚函数,在main函数中调用 } }; int main(){ std2 *p=new std2(); //定义对象 p->my(); p->my1(); //std1 *p1=new std1(); std1中有纯虚函数 默认为抽象类,不允许创建对象 //p1->my(); system("pause"); return 0; }</strong>