一、面向对象的三大特性
1、封装
通过封装将一部分成员隐藏起来,另一部分成员作为类或对象与外部的接口。从而控制数据的访问权限,并且能够减少程序中不同部分之间的相互影响。隐藏对象的属性和接口实现细节,仅仅对外提供接口和方法。
优点:提高安全性,隔离影响。
2、继承
在父类基础上创建派生类,可以通过增加、修改、替换父类成员产生派生类,对父类进行扩充,这种继承性使程序具有可重用性。子类可以从父类中获得同类的本质特征,并且增加个体特征,而不必完全重新定义。
优点:提高代码重用性。
3、多态
多态体现在两个方面,动态联编和静态联编,分别指 在程序运行时的多态 和 在程序编译时的多态。
动态联编:在子类中 重写 基类的虚函数,使用 基类指针 或者 基类引用 指向子类对象时,可以实现不同的功能。
静态联编:使用 普通的函数重载 或者 函数模板的使用,实现调用同名函数实现不同功能。
优点:提高代码重用性,提高可扩展性
二、多态特性
1、联编
联编就是把函数名与函数体的程序代码连接(联系)在一起的过程。
静态联编就是在编译阶段完成的联编。静态联编函数调用速度很快。效率高, 但缺乏灵活性;
动态联编是运行阶段完成的联编。动态联编在运行时才能确定调用哪个函数,它降低了程序的运行效率,但增强了程序的灵活性。
2、多态
编译时多态是通过静态联编来实现的。编译时多态性主要是通过函数重载和运算符重载实现的。
运行时多态是通过动态联编实现的。运行时多态性主要是通过虚函数来实现的。
(一)运算符重载
将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。 编译系统对重载运算符的选择,遵循函数重载的选择原则。
1、普通成员函数(实际运算对象 是 私有成员))第一个运算对象不传入
(1)复数相加 a + b
complex operator+(complex b) {
int r = this->real + b.real;
int v = this->imag + b.imag;
return complex(real, imag);
}
(2)单目运算符(一种复数取非) !a
complex operator!() {
this->real = !(this->real);
this->imag = !(this->imag);
return complex(this->real, this->imag);
}
(3)前置 ++a
complex operator++() {
this->real += 1;
this->imag += 1;
return complex(this->real, this->imag);
}
(4)后置 a++,多一个int代表后置,但是不写形参
complex operator++(int) {
this->real += 1;
this->imag += 1;
return complex(this->real - 1, this->imag - 1);
}
2、友元函数(实际运算对象 是 私有成员)
(1)复数相加 a + b
complex operator+(complex a, complex b) {
int r = a.real + b.real;
int v = a.imag + b.imag;
return complex(real, imag);
}
(2)单目运算符(一种复数取非) !a
complex operator!(complex a) {
a.real = !a.real;
a.imag = !a.imag;
return complex(a.real, a.imag);
}
(二)函数重载
(三)虚函数
参考链接:
https://blog.csdn.net/bitlxlx/article/details/77743467
https://www.cnblogs.com/jiangzhaowei/p/9129092.html