gpt4 book ai didi

c++ - 何时将 C++ 中的函数标记为虚函数?

转载 作者:可可西里 更新时间:2023-11-01 14:54:21 28 4
gpt4 key购买 nike

由于 C++ 方法的静态绑定(bind)特性,这会影响多态调用。

来自维基百科:

Although the overhead involved in this dispatch mechanism is low, it may still be significant for some application areas that the language was designed to target. For this reason, Bjarne Stroustrup, the designer of C++, elected to make dynamic dispatch optional and non-default. Only functions declared with the virtual keyword will be dispatched based on the runtime type of the object; other functions will be dispatched based on the object's static type.

所以代码:

Polygon* p = new Triangle;
p->area();

假设 area() 是 Parent 类中的 non-virtual 函数,在 Child 类中被 overridden ,上面的代码将调用 Parent 的类方法,这可能不是开发人员所期望的。 (感谢我介绍的静态绑定(bind))

那么,如果我想编写一个供其他人使用的类(例如库),我是否应该将我的所有函数都设为虚拟函数以使之前的代码按预期运行?

最佳答案

简单的答案是,如果您打算为运行时多态性覆盖您的类的函数,您应该将它们标记为 virtual,如果您不打算这样做,则不要标记。

不要仅仅因为您觉得它赋予了额外的灵 active 就将您的函数标记为 virtual,而应考虑您的设计和公开接口(interface)的目的。例如:如果您的类不是为继承而设计的,那么将您的成员函数设为虚拟将会产生误导。一个很好的例子是标准库容器,它们不应该被继承,因此它们没有虚拟析构函数。

没有理由不将所有成员函数标记为虚拟的,引用一些性能惩罚,非 POD 类类型等等,但如果你真的打算你的类是 intended 对于运行时覆盖,这就是它的目的及其关于和克服所谓的缺陷。

关于c++ - 何时将 C++ 中的函数标记为虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8298041/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com