文章目录
- 1.重载多态
- 1.1 函数重载
- 1.2 运算符重载
- 2.强制多态
- 3.类型参数化多态
- 4.包含多态
类的多态
多态是指同样的消息被不同类型的对象接收时导致不同的行为。
所谓消息是指对类成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。
在C++中,这种多态性可以通过重载多态(函数和运算符重载) 、强制多态(类型强制转换)、
类型参数化多态(模板)、包含多态(继承及虚函数)四种形式来实现。
1.重载多态
重载是多态性的最简单形式,分为函数重载和运算符重载。
1.1 函数重载
重定义已有的函数称为函数重载。在C++中既允许重载一般函数,也允许重载类的成员函数。
如对构造函数进行重载定义,可使程序有几种不同的途径对类对象进行初始化。
class bird {
public:bird(int s):size(s){}void eat() {cout << "我是小鸟,我吃虫子!" << endl;}void eat(int size) {cout << "我是" << size << "cm的小鸟,我吃虫子!" << endl;}void display() {cout << size << endl;}~bird(){}
private:int size;
};
int main() {bird maque(10);maque.eat();maque.eat(17);maque.display();return 0;
}
1.2 运算符重载
C++允许为类重定义已有运算符的语义,使系统预定义的运算符可操作于类对象。
如流插入(<<)运算符和流提取(>>)运算符(原先语义是位移运算)。
class fish {
public:fish(double s):size(s){}fish(){}fish operator +(fish &f2){fish f3;f3.size = (this->size + f2.size) / 2;return f3;}void display() {cout << size << endl;}
private:double size;
};
int main() {fish f1(10), f2(20), f3;f3 = f1 + f2;f3.display();return 0;
}
2.强制多态
强制多态也称类型转换。
可以在表达式中使用3种强制类型转换表达式:
①static_cast<T>(E);②T(E);③(T)E,其中E代表运算表达式,
T代表一个类型表达式。上述任意一种都可改变编译器所使用的规则,以便按自己的意愿进行所需的类型强制。
但是强制多态使类型检查复杂化,尤其在允许重载的情况下,导致无法消解的二义性。
3.类型参数化多态
模板是C++实现参数化多态性的工具,分为函数模板和类模板。
类模板中的成员函数均为函数模板,因此函数模板是为类模板服务的。
template <class T,int N>
class horse {
public:horse(T s):size(s){}void display() {cout << "我是" << N << "号马," << "有" << size << "cm" << endl;}T length() {return 2 * size;}
private:T size;
};
int main() {horse<double, 3> bailongma(120.8);horse<int, 8> chitu(150);bailongma.display();chitu.display();cout << bailongma.length() << endl;cout << chitu.length() << endl;return 0;
}
4.包含多态
C++中采用虚函数实现包含多态。虚函数为C++提供了更为灵活的多态机制,
这种多态性在程序运行时才能确定,因此虚函数是多态性的精华,
至少含有一个虚函数的类称为多态类。包含多态在面向对象程序设计中使用十分频繁。
class caofish {
public:virtual void eat() {cout << "我吃泥" << endl;}
};
class heiyu :public caofish {
public:virtual void eat() {cout << "我吃草鱼" << endl;}
};
int main() {caofish cf;heiyu hy;caofish* ptr=&hy;ptr->eat();return 0;
}