第三章、多态性
1.1、虚函数
一、多态性
- 同一消息发给不同对象执行不同操作
- 在c++中,多态性表现形式之⼀是:具有不同功能的函数⽤同⼀个函数名,这样就可以⽤⼀个函数名调⽤不同内容的函数
- C++中的多态性分为两类:编译时的多态性和运行时的多态性。编译时的多态性是通过函数重载和模板体现的,其实现机制称为静态绑定;运行时的多态性是通过虚函数体现的,其实现机制称为动态绑定。
二、虚函数
1、虚函数
虚函数的作⽤是允许在派⽣类中重新定义与基类同名的函数,并且可以通过基类指针或引⽤来访问基类和派⽣类中的同名函数
virtual 函数类型 函数名(形参表){
函数体;
}
- 只有类的成员函数才能声明为虚函数
- 虚函数不能是静态成员函数,也不能是友元函数
- 若在基类中定义虚函数,在派生类中还需重新定义
- 构造函数不能是虚函数,析构函数可以是虚函数
- 在基类中⽤virtual声明成员函数为虚函数。在类外 定义虚函数时,不必再加virtual
2、虚析构函数
定义基类的析构函数是虚析构函数,当程序运行结束时,通过基类指针删除派生类对象时,先调用派生类析构函数,然后调用基类析构函数
class A{
public:
~A(){
cout<<"A::~A() is called."<<endl;
}
A(){
cout<<"A::A() is called."<<endl;
}
}
class B:public A{
private:
int *ip;
public:
B(int size=0){
ip=new int[size];
cout<<"B::B() is called."<<endl;
}
~B(){
cout<<"B::~B() is called."<<endl;
delete []ip;
}
};
int main(){
A *b=new B(10);
delete b;
return 0;
}
输出:
A::A() is called.
B::B() is called.
A::~A() is called.
如果A的析构函数为:
virtual ~A(){
cout<<"A::~A() is called."<<endl;
}
则输出为:
A::A() is called.
B::B() is called.
B::~B() is called.
A::~A() is called.
1.2纯虚函数和抽象类
一、纯虚函数
1、定义
virtual 函数类型 函数名 (参数表)=0;
2、特点
- 纯虚函数没有函数体
- 最后⾯的 =o并不表示函数返回值为o,它只是起形式 上的作⽤,通知编泽系统:在这⾥声明⼀个虚函 数,留待派⽣类中定义
二、抽象类
1、定义
类中至少含有一个纯虚函数
2、特点
抽象类⽆法建⽴对象
1.3静态联编和动态联编
一、静态联编
程序运行之前,在编译阶段就已经确定下来到底要使用哪个函数
二、动态联编
在程序运行时确定对象所调用的函数