C++的多态性包括编译时的多态和运行时的多态。
1.编译时的多态
编译时多态性是通过函数重载、运算符重载和模板实现的。函数重载是指在同一作用域内定义了多个名称相同但参数类型不同的函数。C++编译器会根据函数调用中的参数类型来选择调用哪个函数。
(1)函数重载
#include <iostream>
using namespace std;
int Add(int left, int right)
{
return left + right;
}
double Add(double left, double right)
{
return left + right;
}
int main()
{
cout<<Add(10, 20)<<endl;
cout<<Add(10.1, 20.1)<<endl;
return 0;
}
运行结果
30
30.2
(2)模板
模板在上一节中有描述,此处不再详解。
(3)运算符重载operator
后面章节单独讲
2.运行时的多态
运行时多态性是通过虚函数和继承实现的。虚函数是指在基类中声明为虚函数的函数,在派生类中可以被重写,派生类对象调用该函数时,将会调用派生类中的函数,而不是基类中的函数。
假如有景点卖票,正常票100,学生票50,折扣票88
实现方式如下,下面的例子很好的说明了运行时多态的情况
#include <iostream>
using namespace std;
class Person {
public:
Person(const char* name)
:_name(name)
{}
// 虚函数
virtual void BuyTicket() { cout << _name << " Person:买票100" << endl; }
protected:
string _name;
};
class Student : public Person {
public:
Student(const char* name)
:Person(name)
{}
// 重写/覆盖
void BuyTicket() { cout << _name << " Student:买票50" << endl; }
};
class Discount : public Person {
public:
Discount(const char* name)
:Person(name)
{}
// 重写/覆盖
void BuyTicket() { cout << _name << " Discount:折扣票88" << endl; }
};
void Pay(Person& ptr)
{
ptr.BuyTicket();
}
int main()
{
Person pe("1111");
Pay(pe);
Student st("2222");
Pay(st);
Discount so("3333");
Pay(so);
return 0;
}
运行结果
1111 Person:买票100
2222 Student:买票50
3333 Discount:折扣票88