标签:out 友元函数 return 数据 ios img dcl 作用 绑定
多态的类型:分为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;会报错
说明纯虚函数不能实例化,也就是不能有实际对象。
标签:out 友元函数 return 数据 ios img dcl 作用 绑定
原文地址:https://www.cnblogs.com/3093105614qq/p/11746144.html