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();
};