📜  C++多态性(1)

📅  最后修改于: 2023-12-03 14:39:59.482000             🧑  作者: Mango

C++多态性

在面向对象编程(OOP)中,多态性(Polymorphism)是一种能够支持统一抽象的概念。C++中的多态性通过函数重载、模板和虚函数(Virtual Functions)等特性来实现。

函数重载

函数重载(Function Overloading)是一种在类内或者命名空间内实现同一函数名但传入参数类型或参数数量不同的函数。函数重载的优点是代码复用,可以在同一函数名下实现不同参数类型或数量的重载函数。函数重载的实现方式是在函数定义前加上inlineconstvolatile等关键字,让函数的参数类型和数量进行区分。

//函数重载例子
#include<iostream>
using namespace std;
class A {
public:
    void foo(int i){ cout << "int\n"; }
    void foo(string s){ cout << "string\n"; }
};
int main(){
    A a;
    a.foo(123);     //输出 int
    a.foo("hello"); //输出 string
    return 0;
}
模板

C++中的模板(template)是一种泛型编程的实现方式,可以实现同一代码适用于不同的数据类型,其实现方法就是使用占位符来表示数据类型。

//模板例子
#include<iostream>
using namespace std;
template <typename T>
T Sum(T a,T b){
    return a+b;
}
int main(){
    cout<<Sum(3,4)<<endl;   //输出 7
    cout<<Sum(2.5,3.1)<<endl; //输出 5.6
    return 0;
}
虚函数和多态

虚函数(Virtual Functions)是指通过使用关键字virtual标记的成员函数,使用虚函数是为了在基类和派生类之间实现多态性。派生类可以重写虚函数来适应自己的需求,基类通过使用虚函数可以调用适应派生类的函数。

//虚函数和多态例子
#include<iostream>
#include<cstring>
using namespace std;
class Shape {
public:
    virtual double getArea() = 0;
};
class Circle : public Shape {
public:
    Circle(double r){ radius = r; }
    virtual double getArea() { return 3.14*radius*radius; }
private:
    double radius;
};
class Rectangle : public Shape {
public:
    Rectangle(double w,double h){ width = w; height = h; }
    virtual double getArea() { return width*height; }
private:
    double width, height;
};
int main(){
    Shape *s;
    Circle c(2);
    Rectangle r(2,3);
    s = &c;
    cout<<s->getArea()<<endl;        //输出 12.56
    s = &r;
    cout<<s->getArea()<<endl;        //输出 6
    return 0;
}

在上面的例子中,Shape是基类,Circle和Rectangle是Shape的派生类。Shape中定义的虚函数getArea被派生类Circle和Rectangle所重写,通过指针s来调用虚函数,实现了多态性。这样Shape可以在不知道指针所指对象的时候调用适应派生类的函数。

总的来说,C++的多态性为我们提供了一种灵活的面向对象编程的方式,可以通过继承、虚函数等方式实现代码的可重用化。模板的使用也为我们解决了同样的问题,比如STL容器中的模板就是适用于不同类型的容器。在实际编程中,需要根据需求选择不同的实现方式。