🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 同一个操作作用于不同的对象,可以有不同的解释,会产生不同的效果,这就是多态. ~~~ class Father { public: virtual void printABC() { cout << "父类" << endl; } }; class Son1: public Father { public: virtual void printABC() { cout << "son1" << endl; } }; class Son2 : public Father { public: virtual void printABC() { cout << "son2" << endl; } }; void doLogin(Father *obj) { obj->printABC(); } void test02() { Father *obj = NULL; obj = new Son2; doLogin(obj); delete obj; } ~~~ # 纯虚函数和抽象类 **只要有纯虚函数的类叫抽象类,不能实例化对象.** **子类必须实现抽象类的所有纯虚函数,不然子类也变为抽象类** ~~~ //抽象层 class rule { public: //纯虚函数 virtual int getNum(int a, int b) = 0; }; ~~~ # 静态联编问题 ~~~ Father *obj = new Son2; delete obj; ~~~ 如果父类的析构不是虚函数,那么不会调用Son2的析构. 因为这边`delete obj`被编译器静态联编了. 父类的析构需要加virtual,这样delete的时候,子类的析构会调用,同时也会调用父类的. 编译器不会做静态联编 # 纯虚析构函数 **纯虚析构函数需要在类外实现.子类实现不了** ~~~ class Animal { public: virtual ~Animal() = 0; }; Animal::~Animal() { cout << "纯虚析构函数" << endl; } ~~~ **这种是虚析构函数** ~~~ virtual ~Base() {} ~~~