多态是C++面向对象三大特性之一
多态分为两类
1.静态多态:函数重载 和 运算符重载属于静态多态,复用函数名
2.动态多态:派生类和虚函数实现运行时多态。
静态多态和动态多态的区别:
静态多态的函数地址早绑定-编译阶段确定函数地址。
动态多态的函数地址晚绑定-运行阶段确定函数地址。
动态多态满足条件
1.存在继承关系
2.子类重写父类的虚函数
重写 函数返回值类型 函数名 参数列表 完全相同
动态多态使用
父类指针或引用 指向子类对象
例子:
son1类和son2类是person类的子类,并且person是抽象类
son1 a;
son2 b;
person& p = a;
p.speak();
person* p1 = new son2;
p1->speak();
person* p2 = &b;
p1->speak();
多态的优点
1.代码组织结构清晰
2.可读性强
3.利于前期和后期的扩展以及维护。
总结:C++开发提倡利用多态设计程序架构,因为多态优点很多
纯虚函数和抽象类
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)=0;
当类中有了纯虚函数,这个类也称为抽象类。
抽象类的特点:
1.无法实例化对象
2.子类必须重写抽象类中的纯虚函数,否则也属于抽象类。
虚析构和纯虚析构
目的:多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。
共性:
1.可以解决父类指针释放子类对象
2.都需要具体函数实现
区别:
如果是纯虚析构,该类属于抽象类,无法实例化对象。
语法:
虚析构:virtual ~类名() {}
纯虚析构:virtual ~类名()=0; //在类内声明
类名:: ~类名(){} //在类外实现
总结:
1.虚析构或纯虚析构就是用来解决通过父类指针释放子类对象。
2.如果子类中没有堆区数据, 可以不写为虚析构或纯虚析构。
3.拥有纯虚析构的类和拥有纯虚函数的类一样都属于抽象类。
【文章原创作者:建湖网页开发公司 http://www.1234xp.com/jianhu.html 欢迎留下您的宝贵建议】