欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3、C++设计模式及实际应用-多态

程序员文章站 2024-01-20 19:53:28
...

多态,学习过面向对象开发的读者应该不会陌生,在C++里面,它可以实现父类指针调用其子类方法的效果。具体语法细节,读者可自行查看相关书籍进行学习,本节主要讲述多态在实际开发中的应用。

在我们平时的开发过程中要慎用多态,C++中,多态是通过虚函数来实现的,调用虚函数的性能消耗比调用普通成员函数大很多。

下面我们通过一个图形渲染的例子讲述一下多态的具体用法,比如我们开发一个图像渲染框架,需要实现立方体、球体和圆柱体的渲染。
在不考虑多态的情况下,简单的代码实现可以是这样

struct Cube {};				// 立方体渲染数据
struct Sphere {};			// 球体渲染数据
struct Cylinder {};			// 圆柱体渲染数据

class Renderer {
public:
  void drawCube(Cube& object);			// 渲染立方体
  void drawSphere(Sphere& object);		// 渲染球体
  void drawCylinder(Cylinder& object);	// 渲染圆柱体
};

// 渲染立方体、球体和圆柱体
int main() {
  Cube cube;		
  Sphere sphere;	
  Cylinder cylinder;
  Renderer renderer;
  renderer.drawCube(cube);
  renderer.drawSphere(sphere);
  renderer.drawCylinder(cylinder);
  return 0;
}

这样实现的话,以后如果想扩展新的渲染的图形结构,就需要不停地在Renderer里面新增渲染方法了,这样非常便于后期代码的维护。

下面介绍一下使用多态的方法来实现上述功能

class Object {
public:
  virtual void draw() = 0;
};

class Cube : public Object {
public:
  void draw();
};

class Sphere : public Object {
public:
  void draw();
};

class Cylinder : public Object {
public:
  void draw();
};

class Renderer {
public:
  void render(Object* object) {
    object->draw();
  }
};

// 渲染立方体、球体和圆柱体
int main() {
  Object* cube = new Cube();
  Object* sphere = new Sphere();
  Object* cylinder = new Cylinder();
  Renderer renderer;
  renderer.render(cube);
  renderer.render(sphere);
  renderer.render(cylinder);
  delete cube;
  delete sphere;
  delete cylinder;
  return 0;
}

采用多态的设计方式后,如果我们需要新增一个四面体,则只需要新定义一个Tetrahedron类即可,其它代码不需要改动

class Tetrahedron: public Object {
public:
  void draw();
};