English 中文(简体)
继承和虚拟职能 五. 通用方案
原标题:Inheritance & virtual functions Vs Generic Programming

I need to Understand that whether really Inheritance & virtual functions not necessary in C++ and one can achieve everything using Generic programming. This came from Alexander Stepanov and Lecture I was watching is Alexander Stepanov: STL and Its Design Principles

最佳回答

我总是想把模板和遗产视为两个orthogonal概念,从字面上讲: 对我来说,遗产是“纵向”的,从顶级的基级开始,将“下级”改为多级。 每一类(公开)衍生产品is,其接口基础类别: dle是一种动物。

另一方面,模板是“横向”的:模板的每个instance有相同的 正式代码内容,但两个不同的实例是完全分开的、与“平行”有关的、不相互看。 分配一系列的群种与分类一系列浮体是正式一样的,但一系列的群种并非与一系列浮体有关。

由于这两个概念完全是直截了当的,因此它们的应用也是一样的。 当然,你可以争辩地认为,你可以相互取而代之,但是,如果同时进行,那么两个模板(遗传)的方案规划和继承(变形)方案都是独立的技术,两者都有其位置。

遗产在于增加细节,使抽象的概念更加具体。 通用节目基本上是代码生成<>。

作为我的有利例子,请允许我提到,这两个技术如何在广受欢迎的实施型世纪/>时汇聚在一起: 单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单箱子对面,而具体的、衍生的集装箱类别则被确定为模版式的造物。 我们使用模版的代号来创建一种任意的衍生型家庭:

// internal helper base
class TEBase { /* ... */ };

// internal helper derived TEMPLATE class (unbounded family!)
template <typename T> class TEImpl : public TEBase { /* ... */ }

// single public interface class
class TE
{
  TEBase * impl;
public:
  // "infinitely many" constructors:
  template <typename T> TE(const T & x) : impl(new TEImpl<T>(x)) { }
  // ...
};
问题回答

它们的目的不同。 通用方案(至少在C++)将汇编时间多变,虚拟功能涉及时间多变。

如果具体类型的选择取决于用户的投入,那么你确实需要操作时间的多吗? 模板获得帮助。

Polymorphism (i.e. dynamic binding) is crucial for decisions that are based on runtime data. Generic data structures are great but they are limited.

例:为单项活动模拟器考虑一名活动手: 采用纯粹的虚拟功能来开展这项工作非常便宜(在方案拟定工作方面),但是,如果纯粹使用模版的班级,则会比较简单和难以灵活。

rule 如果你发现某些投入物的价值为 yourself开(或如果是轮.),并根据其价值采取不同的行动,那么(从可维持性的角度)解决办法可能更好,具有动态约束力。

一段时间前,我对一个类似问题进行了思考,我只能梦想给你这样一个伟大的回答。 或许,这是有益的:interface Model Performance (dynamic binding vs. general program)

这似乎是一个非常学术的问题,如同生活中的大多数情况一样,有许多办法可以做事,就C++而言,你有若干办法可以解决问题。 没有必要对事情采取XOR态度。

在理想世界,你将使用静态多形态模板,在用户投入无法确定这种模式的情况下,给你尽可能好的业绩。

The reality is that templates force most of your code into headers and this has the consequence of exploding your compile times.

我做了一些利用静态多变性来实施一般的PC图书馆的大型通用节目(https://github.com/byte Principal/mace(pc_static_poly Branch)。 在这种情况下,议定书(Jerson-RPC、运输(TCP/UDP/Stream/etc)和类型)在编纂时都知道,因此没有理由做令人怀疑的派遣......或是否有这样的运输?

当我通过一个单一程序前处理器操作该守则时。 c 计算结果为25万条线,需要30+秒才能编制单一物体档案。 我在 Java和C#实施了相同的功能,并汇编了约第二份。

几乎每 st或加强头盔,包括增加数千条或10条,必须处理每个主题文件,其中多数是多余的。

是否汇编时间? 在大多数情况下,它们对最后产品的影响比最大程度优化的消除影响更大。 原因是,每ug都需要试卷、汇编、测试周期,如果每个周期需要30+秒,则发展速度慢慢慢到无计划(谷歌语的动机)。

在用java和C# I花了几天后,我决定需要重新考虑我对C++的做法。 没有理由认为,C++方案应比履行同样职能的C基础要慢得多。

现在我选择了超时的多变,除非貌相显示瓶颈是难以置信的。 我现在使用模板,在涉及空白*或抽象基类的基本物体顶端提供刚刚出现的多形态和类型安全接口。 这样,用户不必从我的接口中获取,而且仍然感觉到通用的方案规划,但是他们能够受益于快速汇编的时间。 如果履约成为一个问题,则通用守则可改为静态多变。

成果是惊人的,汇编时间从30+秒减少到大约2次。 后处理器源代码目前是1 000条线,而不是25万条线。

在讨论的另一方面,我正在开发一个司机图书馆,用于一套类似的但略有不同嵌入装置。 在此情况下,嵌入装置没有额外的编码空间,也没有用于可变的发送。 我们唯一的选择是,通过职能点,单独提交物体档案或运行时间多变。 利用通用节目和静态多形态,我们得以创建可维持的软件,其速度比我们在C生产的任何产品要快。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?