C++中的多态性分为编译时多态性和运行时多态性,编译时多态通过函数重载和模板体现,运行多态通过虚函数体现
编译、连接,成为可执行文件的过程,是把可执行代码联编在一起的过程。在运行之前就完成的联编成为静态联编;运行时才完成的联编称为动态联编
静态联编较为简单,不予赘述。
动态联编
为了达到动态联编获得运行时多态效果,通常都是用指向基类的指针来调用派生类的虚函数
定义为指向基类的指针,可以作为派生类的指针指向派生类对象,可以访问从基类继承下来的各个派生类对象
class Base{ public: void who(){ cout<<"Base"<<endl;}}; class Derived1 : public Base{ public: void who(){ cout<<"Derived1"<<endl;}}; class Derived2 : public Base{ public: void who(){ cout<<"Derived2"<<endl;}}; int main(){ Base base_obj, *p; Derived1 one_obj; Derived2 two_obj; p = &base_obj; p->who(); //输出Base,改过之后Base p = &one_obj; p->who(); //输出Base,改过之后Derived1 p = &two_obj; p->who(); //输出Base,改过之后Derived2 return 0; }
将基类改为virtual void who(){ cout<<"Base"<<endl;}
一个类的实例也被认为是其基类的实例
纯虚函数和抽象类
纯虚函数:是在基类中声明的虚函数,但没有具体的函数定义体,具体定义在各个派生类中。一般格式:
virtual 函数原型 = 0;
包含虚函数的类称为抽象类,例如:
class CClosedFigure{ public: virtual void Draw() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; };
抽象类没有完整的实现,无法实例化,但是可以创建指向抽象类的指针。
CClosedFigure *p; //是正确的