C ++中的虚函数和模板 - 可以用其他(C ++中存在的)操作替换它们吗?

时间:2010-05-28 13:20:36

标签: c++ templates polymorphism virtual-functions

例如,C ++中的模板的概念是为了舒适,因为编译器会为您的类或函数生成一些额外的代码,不是吗?所以我们可以通过做一些额外的(手工工作)而没有模板。

虚拟功能怎么样?

是否存在两种情况都无法替代的情况?

5 个答案:

答案 0 :(得分:3)

是的,我们可以通过做更多的手工工作而无需模板(编写编译器编写的代码,或使用void*删除类型细节)。

是的,我们可以通过做更多的手工工作(使用switch语句或存储自己的vtable结构)来实现没有多态性。

  

是否存在无法替代的情况?

模板和多态方法为您提供了类型安全和编译器强制行为(例如纯虚拟),这些行为无法用某些手动方法替换。例如,std::sort比使用qsort的{​​{1}}更安全。这些手动方法可能导致许多代码必须无错误并得到维护。所以这取决于你对“不可替代”的定义。无论有没有这些功能,这些语言仍然是Turing complete。从理论上讲,你可以用图灵完整语言计算任何东西,所以理论上我们可以用BrainF * ck替换所有语言......我们只是选择不;)

答案 1 :(得分:2)

它不太一样。

模板在编译时有效地生成具有各种签名的函数。您可以非常轻松地复制粘贴或代码自己生成所有等效方法。

虚拟方法用于在运行时做出决策,因此虽然它们确实使程序员的工作更容易,但更难以替换。你不能只是复制粘贴代码来模拟虚函数,而是你必须自己实现几乎相同的东西,使用类似vtable的函数指针表或其他一些替代方法。

简而言之,虚拟函数可以更容易地做一些其他困难的事情,但它是一组不同于模板影响的东西。

答案 2 :(得分:1)

当然;在多态性可用之前,甚至现在在不了解多态性的人的代码中,Giant Switch语句取代了它。

答案 3 :(得分:0)

我发现可以使用多态来实现与模板相同的目的。但是,当你怀疑需要做更多的工作时,它确实如此。还需要考虑其他权衡因素,包括性能和可维护性。当我决定走哪条路时,那些就会发挥作用。

答案 4 :(得分:0)

我怀疑你可以做你需要做的所有事情,而不是操作。其他一切都是肉汁。