文章目录
多态
动多态
定义:“一个接口、多种方法”,在程序运行过程中才决定调用的函数。
允许将子类类型的指针赋值给父类类型的指针。
多态性在c++中通过虚函数(Virtual Function)实现。
重载与多态无关,覆盖与多态有关。
封装(代码模块化)和继承(扩展已存在的代码)的目的都是为了代码重用,而多态的目的是为了接口重用
对象名.方法说明需要在编译时就确定,和那个函数对应,所以是采用静态编译
指针,引用 调用方法时是在执行时才确定调用哪个方法 ,是动态编译多态性是允许将父对象设置成为和它一个或更多的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
编译时多态 早绑定
通过函数重载和运算符的重载来实现的
在编译时确定关系
运行时多态性 晚绑定
程序执行前,无法根据函数名和参数来确定要调用那一个函数
- 必须通过
1.类继承关系public(公有继承表示“是一个”)
2.函数是虚函数,
3.以指针或引用调用虚方法来实现的,目的是建立一种通用的程序
虚函数
- 虚函数是一个类的成员函数。仅用于继承关系中的对象,只能定义在类中,不能再类外定义
- 一个继承关系中只有最顶层的类中有一个虚表指针vfptr
- 虚函数表存在数据区,虚函数表中存放的是虚函数指针
- 虚函数的虚就虚在所谓“推迟联编”或“动态联编”上,一个类函数的调用并不是编译时刻确定的,而是在在运行时才能被确定
- 带有虚函数的类中的每一个对象都有一个虚指针指向该类的虚函数表。
- 声明格式: virtual 返回类型 函数名 ()
- 当某个类的一个类成员函数被定义为虚函数,则由该类派生出的所有派生类中,该函数始终保持虚函数的特征
- 虚函数的定义如果在类外,则virtual只能加在函数声明之前,而不能加在函数定义前面。
什么函数不能声明为虚函数
全局函数、静态函数(静态函数是被所有对象所共享的函数)、友元函数、构造函数(调用构造函数时还没有进行实例化)、内联函数都不能定义为虚函数
虚析构函数:在类的继承时,防止释放内存时忘记释放派生类的对象。
析构函数可以定义为虚函数
在没有继承关系时,可以不写成虚函数,但如果存在继承关系,则基类的析构函数要写成虚函数。
当基类的指针或引用指向子类的对象时,会调用基类和子类的构造函数,如果子类的构造函数在堆上开辟了空间的话,当这个对象需要析构时,如果基类的析构函数不是虚函数,那么对象在析构时就只会调用基类的析构函数而不调用子类的析构函数,这就导致子类对象被构造了,但是没有被析构,这样会导致内存泄漏的情况出现。
- 纯虚析构函数
声明之后,在类外实现的析构函数
class A{
public:
A(){
cout<<"构造函数A"<<endl;
}
virtual ~A() = 0;
};