C++ 多态性和虚函数
2017-06-27 19:17:52
C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助。
一、多态的作用:
- 隐藏实现细节,使得代码能够模块化;
- 接口重用,实现“一个接口,多种方法”;
二、虚函数的声明:
class Base
{
virtual 返回值类型 函数名(形参表){}
}
- 当基类的某个成员函数被声明为虚函数后,其子类中的函数如果返回值类型,函数名,形参表一致的话,不论是否加了virtual关键字,都会被认为是虚函数。反之,则是同名隐藏。
- virtual关键字只是在类中声明的时候必须加上,在类外定义的时候不需要加virtual关键字
- 构造函数,静态成员函数不能是虚函数,析构函数可以是虚函数,甚至鼓励将析构函数写成虚函数
- 只有通过基类的对象指针,基类的对象引用来调用派生类的虚函数,才能体现虚函数的特性。单纯通过子类来调用虚函数是无法体现这种动态联编的特性的。
A* p=&b
A& p=b
三、多态性的实现
可以使用基类的对象指针来先后指向同一类族中的不同类对象,以便使用相同的调用方法去调用不同派生类的同名虚函数。
class A { int a; public: A(int x) { a=x; } virtual void get(){cout<<"A::"<<a<<endl;} }; class B:public A { int b; public: B(int x,int y):A(x) { b=y; } void get(){cout<<"B::"<<b<<endl;} }; class C:public B { int c; public: C(int x,int y,int z):B(x,y) { c=z; } void get(){cout<<"C::"<<c<<endl;} }; int main() { C c1(1,2,3); A* p1=&c1; B* p2=&c1; p1->get(); p2->get(); return 0; }
四、纯虚函数
定义一个基类的时候如果还无法给出虚函数的具体实现方式,可以将之声明为纯虚函数,纯虚函数的实现完全依赖于各个派生类。
纯虚函数的声明:
virtual 返回值类型 函数名(形参表)=0;
- 因为无法给出纯虚函数的定义所以没有函数体,没有函数体和函数体为空是两个概念,要加以区分;
- 函数名赋值为0,本质上是将指向该函数的指针的地址赋值为0。在派生类没有重定义之前是无法加以使用的。
五、抽象类
抽象类是指无法定义对象只能作为基类的一种特殊的类,但是可以定义对象指针,目的是为了实现多态性。
抽象类有两种:
- 有纯虚函数的基类
- 构造函数或者析构函数被定义为protected访问