关于纯虚函数的C ++设计原则?

时间:2014-03-02 05:12:43

标签: c++ oop

我最近一直在制作一个游戏程序。我创建了一个名为Drawable的基类,表示可能需要(并且可以)绘制到屏幕上的内容。

显然,我从Drawable派生了很多类,每个类都有自己的draw()函数实现。现在我有两个选项,对于Drawable:

virtual void draw(param);

virtual void draw(param) = 0;

现在让我们看看另一个类,比如,Scene,它可能包含一堆Drawable实例,这些实例存储在一个向量中。多态性使得可以迭代地调用每个存储对象的draw()函数。

那么,在OOP设计方面哪种方式更好?

我是C ++的新手,总是发现抽象类的con / destructors很神秘,尤其是编译器对它们的处理方式。

简单来说,不是一个带有一些纯虚函数f()= 0的抽象类,我可以把它作为

virtual f(){};

与上述方法相比,纯虚函数/抽象类的优缺点是什么?

1 个答案:

答案 0 :(得分:4)

最重要的问题是该函数是否可以在最顶层的声明类中具有合理的默认值,例如什么都不做。

如果是,那么为什么不提供默认值:这很方便。

但如果没有,请将其设为纯虚拟。 IIRC,在最初的Smalltalk中,不是将方法声称为纯虚拟的,而是让实现引发异常“子类责任”。这就是纯虚拟的本质,它不能在基类中合理地指定,但必须由每个派生类定义。


第二个问题是纯虚函数阻止了类的直接实例化,即使类抽象化。它是次要的,因为当没有合理的默认值时,在声明类的对象上调用函数并不是很有意义,因此它在那里是纯虚拟并不重要。