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

多态,学习过面向对象开发的读者应该不会陌生,在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();
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的多态是指在基类和派生类之间,通过虚函数实现的动态绑定机制。通过多态性,可以在基类的指针或引用上调用派生类的函数,实现动态绑定和运行时多态。 在C++中,要实现多态性,需要使用以下两个关键字: 1. virtual:在基类中声明虚函数,表示该函数可以被派生类重写。 2. override:在派生类中重写虚函数时,使用override关键字,表示该函数是对基类虚函数的覆盖。 下面是一个简单的示例: ```c++ #include <iostream> using namespace std; class Shape { protected: int width; int height; public: virtual int area() { cout << "Parent class area :" << endl; return 0; } }; class Rectangle: public Shape { public: int area () override { cout << "Rectangle class area :" << endl; return (width * height); } }; class Triangle: public Shape { public: int area () override { cout << "Triangle class area :" << endl; return (width * height / 2); } }; int main() { Shape *shape; Rectangle rec; Triangle tri; // 矩形对象的地址赋值给指向基类的指针 shape = &rec; // 调用矩形的求面积函数 area shape->area(); // 三角形对象的地址赋值给指向基类的指针 shape = &tri; // 调用三角形的求面积函数 area shape->area(); return 0; } ``` 在上面的示例中,定义了一个Shape基类和两个派生类Rectangle和Triangle。在Shape类中声明了一个虚函数area(),在Rectangle和Triangle类中重写了该函数。在main函数中,分别创建了Rectangle和Triangle对象,并将它们的地址赋值给基类Shape的指针shape。通过shape指针调用area()函数时,会根据对象的实际类型,动态地调用相应的派生类函数,实现了多态性和动态绑定机制。 总的来说,C++中的多态性是一种重要的面向对象特性,可以提高程序的可扩展性和可维护性,应用广泛。在实际的开发中,多态性通常与其他面向对象的技术和设计模式相结合,从而实现更加复杂的功能和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值