【发布时间】:2012-01-08 01:00:17
【问题描述】:
由于方法静态绑定的 C++ 特性,这会影响多态调用。
来自维基百科:
虽然这种调度机制涉及的开销很低,但它 对于该语言的某些应用领域可能仍然很重要 旨在针对。出于这个原因,Bjarne Stroustrup C++ 的设计者,选择使动态调度可选并且 非默认。只有使用 virtual 关键字声明的函数才会 基于对象的运行时类型调度;其他功能 将根据对象的静态类型进行分派。
所以代码:
Polygon* p = new Triangle;
p->area();
假设area() 是Parent 类中的non-virtual 函数,即Child 类中的overridden,则上面的代码将调用Parent's class method,这可能是开发人员所不期望的。 (感谢我介绍的静态绑定)
那么,如果我想编写一个供其他人使用的类(例如库),我是否应该将我的所有函数都设置为虚拟的,以便之前的代码能够按预期运行? p>
【问题讨论】:
-
p.area()甚至无法编译。也许你的意思是p->area()?我想说,是时候拿起一本关于 C++ 的好书了。 -
这取决于您所做的其他设计选择。作为开发人员,我不关心
p->area()是否调用Polygon::area()、Triangle::area或其他一些函数,只要它返回正确答案即可。这完全是图书馆的责任,对图书馆用户来说是不透明的。 -
您可能会觉得this article 很有启发性。
标签: c++ polymorphism virtual dynamic-binding