Muh*_*edy 11 c++ polymorphism virtual dynamic-binding
由于方法的静态绑定的C++性质,这会影响多态调用.
来自维基百科:
尽管此调度机制所涉及的开销很低,但对于该语言设计为目标的某些应用程序区域,它仍然可能很重要.出于这个原因,C++的设计者Bjarne Stroustrup选择了动态调度可选和非默认.只有使用virtual关键字声明的函数才会根据对象的运行时类型进行调度; 其他函数将根据对象的静态类型进行调度.
所以代码:
Polygon* p = new Triangle;
p->area();
Run Code Online (Sandbox Code Playgroud)
如果它area()是Child类non-virtual中Parent类中的函数overridden,则上面的代码将调用Parent's class method开发人员可能不期望的函数.(感谢我介绍的静态绑定)
所以,如果我想编写一个供其他人使用的类(例如库),我是否应该将所有函数都设置为虚拟,以便以前的代码按预期运行?
Alo*_*ave 23
简单的答案是,如果您希望为运行时多态性重写类的函数,则应将其标记为virtual,而不是如果您不打算这样做.
不要virtual仅仅因为您觉得它赋予了额外的灵活性而标记您的功能,而是考虑您的设计和暴露界面的目的.例如:如果您的类不是为继承而设计的,那么将您的成员函数设置为虚拟将会产生误导.一个很好的例子是标准库容器,它们不是要继承的,因此它们没有虚拟析构函数.
有n没有理由不来标记你的所有成员函数虚拟,引用一些性能损失,非POD类类型等,但如果你真的打算,你的类是旨在用于再运行时间overidding是目的它及其所谓的不足之处.