多态性(Polymorphism)是指一个名字,多种语义;或界面相同,多种实现。
重载函数是多态性的一种简单形式。
虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编。
二、
虚函数和基类指针
1.基类指针虽然获取派生类对象地址,却只能访问派生类从基类继承的成员
2.通过基类指针只能访问从基类继承的成员
注:
1、在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、参数类型和顺序完全相同
2、如果仅仅返回类型不同,C++认为是错误重载
3、如果函数原型不同,仅函数名相同,丢失虚特性
四、
虚析构函数
1、构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数
2、析构函数可以是虚的。虚析构函数用于指引delete 运算符正确析构动态对象
例:
#include<iostream>
using namespace std ;
class A
{ public:
~A(){ cout << "A::~A() is called.\n" ; }
} ;
class B : public A
{ public:
~B(){ cout << "B::~B() is called.\n" ; }
} ;
int main() {
A *Ap = new B ;
B *Bp2 = new B ;
cout << "delete first object:\n" ;
delete Ap;
cout << "delete second object:\n" ;
delete Bp2 ;
}
注:
1.派生类应该从它的基类公有派生。?
2.必须首先在基类中定义虚函数。
3.派生类对基类中声明虚函数重新定义时,关键字virtual可以不写。
4.一般通过基类指针访问虚函数时才能体现多态性。
5.一个虚函数无论被继承多少次,保持其虚函数特性。
6.虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数。
7.构造函数、内联成员函数、静态成员函数不能是虚函数。
(虚函数不能以内联的方式进行处理)
8. 析构函数 可以是虚函数, 通常声明为虚函数 。五、纯虚函数和抽象类
1、纯虚函数是一种特殊的虚函数,
2、在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。
3、纯虚函数是一个在基类中说明的虚函数,在基类中没有定义, 要求任何派生类都定义自己的版本