我最近一直在研究游戏程序。我制作了一个称为Drawable的基类,指示可能需要(并且可以)绘制到屏幕上的东西。
显然,我从Drawable派生了很多类,每个类都有自己的draw()函数实现。现在,对于Drawable我有两个选择:
virtual void draw(param);
和:
virtual void draw(param) = 0;
现在,让我们看一下另一个类(例如Scene),该类可能包含一堆Drawable实例,这些实例存储在向量中。多态性使得可以迭代地调用每个存储对象的draw()函数。
那么,就OOP设计而言,哪种方法更好呢?
我是C ++的新手,总是发现抽象类的con / destructors神秘,尤其是编译器如何对待它们。
简而言之,我可以将其替换为一个带有纯虚函数f()= 0的抽象类,而不是
virtual f(){};
与上述方法相比,纯虚函数/抽象类的优点/缺点是什么?
最重要的问题是该函数在最顶层的声明类中是否可以具有合理的默认值,例如什么也不做。
如果是这样,那么为什么不提供默认值:这很方便。
但是,如果不是,请使其成为纯虚拟的。在最初的Smalltalk中,IIRC并未将方法声明为类似于纯虚拟的方法,而是让实现引发异常“子类责任”。这就是纯虚拟的本质,它不能在基类中合理地指定,但必须由每个派生类定义。
第二个问题是,纯虚函数阻止类的直接实例化,即使类抽象化。这是次要的,因为当没有合理的默认值时,在声明类的对象上调用该函数就没有什么意义,因此,在那儿纯粹是虚拟的没关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句