# 概念
多态性是指具有不同功能的函数可以用同一个函数名,可以用一个函数名调用不同内容的函数。
# 分类
* 静态多态性
* 动态多态性
# 静态多态性
## 概念
静态多态性采用**静态联编技术**,是指在程序编译阶段就可确定的多态性,又称为**编译时的多态性**。它有两种实现形式:**强制多态**和**重载多态**。
## 强制多态
* 将一种类型的值强制转换成为另一种类型的值称为**类型强制**,即强制多态.
* 在**基本数据类型**之间可以通过**显式**的强制类型转换实现类型强制。
### **例子**
~~~
#include <iostream>
using namespace std;
class A
{
public:
A(int x)
{
a=x; cout<<a<<“ constructor of class A is called!\n”;
} //构造函数用于类型强制
operator int()
{
cout<<a<<“ operator int() is called!\n”; return a;
} //类型转换成员函数用于类型强制
private:
int a;
};
void f(const A& x)
{
cout<<"function f is called!\n";
}
int main( )
{
A obj(1);
f(2);
obj=‘a’;
int m=obj;
return 0;
}
~~~
## 重载多态
重载实际上是给程序正文中相同作用域内的的同一个标识符赋予不同的操作语义。(参考函数重载)
### **例子**
~~~
#include <iostream.h>
using namespace std;
class Circle //圆形类
{
public:
Circle(double a=0.0, double b=0.0, double r=0.0)
{
x=a, y=b, radius=r;
}
double area( )
{
return 3.14159*radius*radius;
}
Circle & max(Circle &c)
{
//函数重载,求2个Circle类对象的最大值
return area( )>c.area( )? *this : c;
}
friend ostream& operator << (ostream&, Circle&);
//运算符重载,将流插入运算符'<<'重载为该类的友元函数
private:
double x,y;//圆心坐标
double radius;//半径
};
ostream& operator<<(ostream &output,Circle &c)
{
output<<“center:(”<<c.x<<‘,’<<c.y<<“)\narea=”<<c.area( )<<endl;
return output;
}
int main( )
{
Circle c1(1, 2, 3),c2(4, 5, 6),c3;
c3=c1.max(c2);
cout<<c3;
return 0;
}
~~~
# 动态多态性
## 概念
动态多态性采用**动态联编技术**,是指在**程序运行阶段**才能确定的多态性,又称为**运行时的多态性**。它有两种实现形式:**类型参数多态**和**包含多态**。
## 类型参数多态
**类型参数多态**即**模板机制**来实现类属,这种方法可以直接将数据类型作为类的参数或函数的参数使用,从而可把功能上一致,而只是在参数类型上有差异的类或函数声明为一个通用类或通用函数,即形成**类模板**或**函数模板**。
### **例子**
~~~
#include <iostream>
using namespace std;
template<class T> //声明类模板
class Compare
{
public:
Compare(T a, T b):x(a), y(b) { }//定义函数模板
T max( ) //定义函数模板
{
return (x>y)?x:y;
}
private:
T x, y;
};
int main()
{
Compare <int> c1(3,7); //定义对象c1,用于两个整数的比较
cout<<c1.max( ) << endl;
Compare <float> c2(45.78,93.6);//定义对象c2,用于两个浮点数的比较
cout<<c2.max( ) <<endl;
Compare <char> c3(’a’, ’A’); //定义对象c3,用于两个字符的比较
cout<<c3.max( ) <<endl;
return 0;
}
~~~
## 包含多态
通过虚函数(virtual function)实现的。包含多态是“一个接口,多种方法”。
## 例子
~~~
#include <iostream>
using namespace std;
//声明类Point
class Point
{
public:
Point(float=0,float=0);
void setPoint(float,float);
float getX() const
{
return x;
}
float getY() const
{
return y;
}
friend ostream & operator<<(ostream &,const Point &);
protected:
float x,y;
};
//定义Point类的成员函数
//Point的构造函数
Point::Point(float a,float b)
{
x=a;y=b;
}
//设置x和y的坐标值
void Point::setPoint(float a,float b)
{
x=a;y=b;
}
//输出点的坐标
ostream & operator<<(ostream &output,const Point &p)
{
output<<"["<<p.x<<","<<p.y<<"]"<<endl;
return output;
}
int main()
{
Point p(3.5,6.4);
cout<<"x="<<p.getX()<<",y="<<p.getY()<<endl;
p.setPoint(8.5,6.8);
cout<<"p(new):"<<p<<endl;
return 0;
}
~~~
- 介绍
- 编程设计语言
- 第一章 对C++的初步认识
- 1.2 最简单的C++程序
- 1.3 C++对C的补充
- 1.3.1 return
- 1.3.2 输入输出流
- 1.3.3 putchar 和 getchar
- 1.3.4 用const定义常变量
- 1.3.5 函数原型声明
- 1.3.6 内置函数
- 1.3.7 函数重载
- 1.3.8 函数模板
- 1.3.9 有默认值的参数
- 1.3.10 作用域
- 1.3.11 const修饰指针
- 1.3.12 引用
- 1.3.13 生命期
- 1.3.14 变量
- 1.3.15 字符串变量
- 第二章 类与对象
- 2.2 类的声明和对象的定义
- 2.3 类的成员函数
- 第三章 关于类和对象的进一步讨论
- 3.1 构造函数
- 3.1.1 对象的初始化
- 3.1.2 构造函数
- 3.2 析构函数
- 3.3调用析构函数和构造函数的顺序
- 3.4 对象数组
- 3.5 对象指针
- 3.6 共享数据的保护
- 3.7 对象的建立与释放
- 3.8 对象的赋值与复制
- 3.9 静态成员
- 3.10 友元
- 3.11 类模板
- 第四章 运算符重载
- 数据类型转换
- 运算符重载
- 重载流插入运算符和流提取运算符
- 第五章 继承与派生
- 继承与派生
- 第六章 多态性与虚函数
- 多态性
- 虚函数
- 纯虚函数与抽象类