C++中的多态性是指在继承关系中,子类能够拥有和父类相同的方法和属性,但在特定情况下能够实现不同的表现形式的特性。这主要是由于函数重载、函数覆盖和虚函数的概念实现的。
- 函数重载
函数重载是一种在同一个作用域中定义多个同名函数的方法,这些函数根据参数的数量、类型或顺序来决定使用哪个函数。
#include <iostream>
using namespace std;
class Calculate{
public:
int add(int a, int b){
return a + b;
}
int add(int a, int b, int c){
return a + b + c;
}
};
int main(){
Calculate c;
cout << c.add(2, 3) << endl; // 5
cout << c.add(1, 2, 3) << endl; // 6
return 0;
}
- 函数覆盖
函数覆盖是指子类中定义一个和父类方法名称和参数类型完全相同的函数,并在子类中定义一个新的实现。当子类的对象调用该方法时,将执行子类中的方法而不是父类中的方法。
#include <iostream>
using namespace std;
class Shape{
public:
virtual int area(){
cout << "Shape area..." << endl;
return 0;
}
};
class Rectangle : public Shape{
public:
int area(){
cout << "Rectangle area..." << endl;
return 0;
}
};
int main(){
Shape *s;
Rectangle rec;
s = &rec;
s->area();
return 0;
}
3.虚函数
虚函数是一种特殊的函数,它可以在基类中被声明为虚拟的,并在派生类中进行重写,以达到多态的效果。通过这种方式,当指向基类的指针或引用调用虚函数时,实际调用的将是派生类的重写函数。
#include <iostream>
using namespace std;
class Shape{
public:
virtual int area(){
cout << "Shape area..." << endl;
return 0;
}
};
class Rectangle : public Shape{
public:
int area(){
cout << "Rectangle area..." << endl;
return 0;
}
};
int main(){
Shape *s;
Rectangle rec;
s = &rec;
s->area();
return 0;
}
以上代码中,当我们调用s->area()
时,由于s
指向的是Rectangle
类的对象,所以会调用Rectangle
类中的virtual
关键字修饰的area
函数,输出Rectangle area...
。
多态机制的具体实现可以参考上述示例,C++的多态机制提高了代码的复用性,并且可以大大减少代码量。