21xrx.com
2024-09-20 00:42:58 Friday
登录
文章检索 我的文章 写文章
多态性及其在C++中的实现方式
2023-06-28 12:47:18 深夜i     --     --
多态性 C++ 虚函数 继承 重载

多态性是面向对象编程中的一个重要概念,它指的是同一类型的对象,在不同的情境下表现出不同的行为特征。多态性可以提高代码的可重用性、可扩展性和可维护性。在C++中,多态性的实现方式主要有三种:虚函数、抽象类和模版。

首先是虚函数。虚函数是在基类中声明的一种特殊的成员函数,它在派生类中可以被重新定义,并且在运行时基于对象的实际类型调用相应的函数。虚函数的实现方式是将函数指针存储在虚函数表中,派生类继承自基类时,会自动生成一个指向基类虚函数表的指针,从而实现多态性。例如:


class Shape {

public:

  virtual void draw() {

   cout << "Shape::draw()" << endl;

  }

};

class Circle : public Shape {

public:

  void draw() {

   cout << "Circle::draw()" << endl;

  }

};

int main() {

  Shape* shapePtr;

  Circle circleObj;

  shapePtr = &circleObj;

  shapePtr->draw();

  return 0;

}

在这个例子中,Shape是一个基类,Circle是它的派生类。基类中有一个虚函数draw(),派生类中覆盖了这个函数。在main()函数中,创建了一个指向Circle对象的指针,并将其赋值给一个Shape指针。在调用shapePtr->draw()时,会根据对象的类型调用不同的函数,即输出“Circle::draw()”。

其次是抽象类。抽象类是无法实例化的类,它只能作为基类来使用,它的特点是至少有一个纯虚函数,即没有实现体的虚函数。纯虚函数的存在,强制派生类必须实现该函数,否则派生类也成为一个抽象类。例如:


class Shape {

public:

  virtual void draw() = 0;

};

class Circle : public Shape {

public:

  void draw() {

   cout << "Circle::draw()" << endl;

  }

};

int main() {

  Shape* shapePtr;

  Circle circleObj;

  shapePtr = &circleObj;

  shapePtr->draw();

  return 0;

}

在这个例子中,Shape是一个抽象类,它里面的draw()函数是一个纯虚函数。Circle是它的派生类,必须实现draw()函数,否则也成为一个抽象类。在main()函数中,创建了一个指向Circle对象的指针,并将其赋值给一个Shape指针。在调用shapePtr->draw()时,会输出“Circle::draw()”。

最后是模版。模版通常被定义成一个类模版或函数模版,它允许在编译期间将同一段代码用于不同的数据类型或参数。模版的实现方式是根据使用的数据类型或参数,生成相应的代码。例如:


template <class T>

void swap(T& a, T& b)

  T temp = a;

  a = b;

  b = temp;

int main() {

  int a = 10, b = 20;

  swap(a, b);

  double x = 3.14, y = 2.72;

  swap(x, y);

  return 0;

}

在这个例子中,swap()函数是一个函数模版,它可以用于多种数据类型。在main()函数中,分别使用swap()函数交换了两个整数和两个浮点数的值。

总之,多态性在面向对象编程中扮演着重要的角色,C++提供了多种实现方式,开发人员可以根据实际的需求选择合适的方式。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复