一、理解多态
多态的含义:指同一个实体同时具有多种形式。如:实体吃,每种动物有不同形式的吃。在C++中意指相同的消息给予不同的对象会引发不同的动作。
多态的作用:使用多态可以减少程序代码冗余,精华代码,通用,是为了编程的统一,减少冗余,方便软件的维护。
C++中多态的分类:
1、动态多态:父类中的虚函数virtual,不同的子类具体实现出不同的virtual函数。父类定义虚函数,子类继承并实现它的功能。。(和Java中的abstract抽象类实现多态性类似)
特别说明:父类指针的概念——以父类为数据类型声明一个指针,该指针可以指向任何一个对象,但是父类指针调用函数时是先调用父类自己的实函数,当发现有空的虚函数时会自动寻找指向对象里面的实现该虚函数的方法。
#include <iostream>
using namespace std;
class a
{
public:
virtual void f() { } //父类中定义一个虚函数,无内容,只占用,并不实现功能
void f2() { cout << endl << "a::f2()"; }//实函数
};
class b1 :public a {
public:b1() {}
void f() { cout << endl << "这是b1类"; } //重写基类虚函数
void f2() { cout << endl << "b1::f2()"; } //虽然继承了基类f2,重新定义同名f2,基类的f2被屏蔽了
};
void main()
{
a* p = new b1(); p->f2(); p->f(); //父类指针——f2是父类的实函数,a父类指针只能访问自己的实函数。派生子类b1实例化一个对象,但使用父类指针指向它
b1* q = new b1(); q->f2(); q->f(); //子类指针——完全在子类中操作
system("pause");
}
2、静态多态:
- 泛型编程——函数重载、类模板。
- 运算符重载
函数重载:定义多个功能相同名字相同的函数,但是参数个数不同、参数类型不同、返回类型不同
#include <iostream>
using namespace std;
int function(int a) {
return a;
}
double function(double a) {
return a;
}
char function(char a) {
return a;
}
void main() {
function(1);
function(1.3);
function('a');
}
函数重载:只需要定义一个函数,配合使用泛型template <typename T>
#include <iostream>
using namespace std;
template <typename T>
T function(T a) {
return a;
}
void main() {
function(1);
function(1.3);
function('a');
}
类模板:在定义类class时,类里面的成员变量和成员方法的类型不具体写为int、double等,而是使用T替代,当再主函数main中实例化时,在类名后面才使用<int>具体化该类中的数据类型。
#include <iostream>
using namespace std;
template <typename T>
class a
{
T x;
T y;
public:
a(T a0, T b0) {
x = a0;
y = b0;
}
T max() {
if (x > y)
return x;
else return y;
}
};
void main()
{
a<int> c1(3, 5);
cout << endl << c1.max();
a<char> c2('k', 'e');
cout << endl << c2.max();
a<double> c3(0.343, 1.4543);
cout << endl << c3.max();
system("pause");
}
运算符重载:在C++中一些运算符是固定设好了的功能,如加减乘除运算符,但是重载功能可以改变这些运算符的原本功能。
#include <iostream>
using namespace std;
template <typename T>
class compi
{
T a;
T b; //复数的实部和虚部a,b
public:
compi(T a0, T b0) { a = a0; b = b0; }//构造函数
/*compi<T> 该重载加法操作返回的是一个复数.
operator+指明复数相加法的加号重载。加号的右边(compi &c)表示传进来的参数是一个复数的地址*/
compi<T> operator+(compi& c)
{
/*加完后顺便把值作为构造函数的参数传入实例化一个复数对象
这两句实现复数加号的功能
把实参的复数的实,虚部与当前对象的实,虚部分别相加*/
compi<T> tempc(this->a + c.a, this->b + c.b);
return tempc; //加法运算返回的结果是一个复数
}
void print() { cout << endl << a << "+" << b << "i"; }
};
void main()
{
compi<int> a(10, 30);
compi<int> b(12, 21);
compi<int> c = a + b;
c.print();
system("pause");
}