重载与多态

多态的类型:分为4类,重载多态,强制多态,包含多态,参数多态。
以前所学过的普通函数的重载也属于重载多态。强制多态是指将一个变元的类型加以变化,以符合一个函数或操作的要求,比如int型与float型相加,要先进行类型转换。
多态的实现:分为两类,编译时的多态与运行时的多态。
前者在编译的过程中确定了同名的具体操作对象,而后者是在程序运行过程中才多态地确定操作所指向的对象。这种确定操作具体对象的过程就是绑定。绑定工作在编译连接阶段完成的情况为静态绑定,在程序运行过程中完成的情况是动态绑定

运算符重载

运算符重载时对已有的运算符赋予多重含义,使同一个运算符作用于不同的数据类型时有不同的行为。

重载形式

重载为类的非静态成员函数,重载为非成员函数。
两种重载方式的声明语法形式一般相同
都为
返回类型 operator 运算符(形参表)
{
函数体
}
非成员函数一般定义为友元函数。

**实现‘+’的重载**
#include<iostream>
using namespace std;
class counter {
private:
	float a;
public:
	counter(float a=0):a(a){}
	counter operator+(counter& c)const {   **//定义为类的非静态成员函数**
		return counter(a + c.a);
	}
	//friend counter operator+(counter& c1,counter& c2);  **//定义为非成员函数**
	void print()const {
		cout <<"和为:"<< a << endl;
		
	}
};
/*counter operator+(counter& c1, counter& c2) {
	return counter(c1.a + c2.a);
}*/
int main() {
	float i, j;
	cout << "输入要相加的两个数:";
	cin >> i >> j;
	counter c1(i),c2(j),c3;
	c3 = c1 + c2;
	c3.print();
	return 0;
}

虚函数

声明语法 virtual 函数类型 函数名(形参表);virtual关键词只能在声明时出现,函数实现时不能出现。
派生类的虚函数关键词virtual,当与基类的虚函数相同,可以省略。此时,派生类的虚函数会覆盖基类的虚函数,以及基类中同名函数的其他重载形式。基于这一特性,虚函数主要用来处理同一类族中不同的对象。

#include<iostream>
using namespace std;
class BaseClass {
public:
	virtual void fun1() {
		cout << "调用BaseClass::fun1" << endl;
	}
	 void fun2() {
		cout << "调用BaseClass::fun2" << endl;
	}
};
class DerivedClass :public BaseClass {![](https://img2018.cnblogs.com/blog/1784291/201910/1784291-20191026225036711-1317513051.png)

public:
	 void fun1() {
		cout << "调用DerivedClass::fun1" << endl;
	}
	void fun2() {
		cout << "调用DerivedClass::fun2" << endl;
	}
};
	void print(BaseClass *p) {
		p->fun1();
		p->fun2();
	}
	

int main() {
	DerivedClass c2;
	
	print(&c2);

}


代码中是将派生类对象的地址传给基类指针*p,输出为派生类的的虚函数的执行,说明派生类的虚函数将基类的虚函数覆盖掉了

纯虚函数

声明语法 virtual 函数类型 函数名 (形参表)=0;与虚函数不同的是,纯虚函数在基类中不需要实现。它是抽象类的标志。

抽象类

如上,它必定带有纯虚函数。抽象类的作用是,通过他,为一个类族创建一个公共的接口。由于派生类的虚函数会覆盖积累的虚函数,在声明纯虚函数后,相当于纯虚函数的函数体由派生类的虚函数来实现,使它们能够更有效地发挥多态特性。

#include<iostream>
using namespace std;
class base1 {
public:
	virtual void display()const = 0;//定义纯虚函数

};
class base2:public base1{
public:
	void display()const {
		cout << "baseclass	\n";
	}
};
void print(base1* p) {
	p->display();
}
int main() {
	//#include<iostream>
using namespace std;
class base1 {
public:
	virtual void display()const = 0;

};
class base2:public base1{
public:
	void display()const {
		cout << "baseclass	\n";
	}
};
void print(base1* p) {
	p->display();
}
int main() {
	//baseclass1 A1;
	base2 A2;
	print(&A2);//与虚函数相同,通过指针或引用来调用纯虚函数
	return 0;

}

在主函数中加入baseclass1 A1;会报错

说明纯虚函数不能实例化,也就是不能有实际对象。

派生类的虚函数或纯虚函数通过与基类的虚函数或纯虚函数返回类型,函数名,形参类型数量自动确定

posted @ 2019-10-26 23:36  牙齿白的  阅读(1248)  评论(0编辑  收藏  举报