问题标签 [virtual-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
15 回答
71193 浏览

c++ - 虚函数和性能 - C++

在我的类设计中,我广泛使用抽象类和虚函数。我有一种感觉,虚拟功能会影响性能。这是真的?但我认为这种性能差异并不明显,看起来我正在做过早的优化。对?

0 投票
6 回答
12055 浏览

c++ - Arduino C++ 代码:可以使用虚函数和异常吗?

从问题编写固件:组装还是高级?

为Arduino平台编译C++代码时,可以使用虚函数、异常等吗?还是您想(必须)使用 C++ 的一个子集(如评论中所述)?

为 Arduino 平台编程时还有其他注意事项吗?

0 投票
7 回答
23136 浏览

c++ - 在 C++ 中用私有函数覆盖公共虚函数

是否有任何理由使重写的 C++ 虚函数的权限不同于基类?这样做有什么危险吗?

例如:

C++ 常见问题解答说这是一个坏主意,但没有说明原因。

我在一些代码中看到了这个习语,我相信作者试图使这个类成为最终的,基于不可能覆盖私有成员函数的假设。然而,这篇文章展示了一个重写私有函数的例子。当然,C++ 常见问题的另一部分建议不要这样做。

我的具体问题:

  1. 在派生类和基类中对虚拟方法使用不同的权限是否有任何技术问题?

  2. 有任何正当理由这样做吗?

0 投票
5 回答
343 浏览

c++ - 类设计建议 - C++

背景

我正在开发一个语音转换器程序,它将英语文本转换为等效的区域语言文本。区域语言的字符将多于英文字母,并且区域语言字体使用字体中的几乎所有位置 (1-255)。

我的程序支持不同的字体,我创建了一个字体类,它有方法可以访问字符。这个类将有 255 个方法,每个方法代表每个字符。所有这些都被标记为虚拟,以便新字体可以覆盖必要的字符方法。

这个字体类中的方法很简单。所有方法都是单行的。例子是

问题

  1. 单个类中的 255 个虚函数会产生任何性能问题吗?我知道vtable的东西,但我不确定它在这种情况下有多大的影响。
  2. 任何人都可以为这门课推荐一个替代设计吗?主要设计目标是允许派生类覆盖必要的方法。我曾考虑将字符添加到地图矢量等容器中,并提供获取字符的方法。但是由于我将有 255 个项目并且经常使用这个类,所以我认为每次我必须循环容器来获取角色,这又是一个问题。

任何想法?

0 投票
10 回答
111779 浏览

c++ - 安全地覆盖 C++ 虚函数

我有一个带有虚函数的基类,我想在派生类中重写该函数。有没有办法让编译器检查我在派生类中声明的函数是否实际上覆盖了基类中的函数?我想添加一些宏或其他东西,以确保我不会意外声明一个新函数,而不是覆盖旧函数。

举个例子:

这里parent::handle_event()被调用而不是child::handle_event(),因为孩子的方法错过了const声明,因此声明了一个新方法。这也可能是函数名称的拼写错误或参数类型的一些细微差别。如果基类的接口发生更改并且某些派生类未更新以反映更改,也很容易发生这种情况。

有什么方法可以避免这个问题,我可以告诉编译器或其他工具帮我检查吗?任何有用的编译器标志(最好是 g++)?你如何避免这些问题?

0 投票
2 回答
974 浏览

c++ - 从构造函数调用虚函数

也许我错了,但这似乎是一个非常基本的问题。突然我的继承链停止工作。编写一个小的基本测试应用程序证明是我错了(所以我不能责怪编译器)。

我有一个基类,在虚函数中具有默认行为。子类从中派生并更改行为。

这打印:

创建 Child 实例时,为什么要调用 Base::print()?我认为通过使用 virtual 关键字,可以将函数替换为派生类。

我在什么时候让自己感到困惑?

0 投票
3 回答
5317 浏览

c++ - C++ 中是否有替代多态性的方法?

在这个关于动态多态性的问题中建议使用 CRTP 。然而,据称这种模式只对静态多态有用。正如这里所暗示的,我正在查看的设计似乎受到虚函数调用的快速阻碍。 即使是 2.5 倍的加速也很棒。

有问题的类很简单,可以完全内联编码,但是直到运行时才知道将使用哪些类。此外,他们可能会以任何顺序被束缚,将性能侮辱堆积到伤害上。

欢迎提出任何建议(包括在这种情况下如何使用 CRTP)。

编辑:谷歌搜索出现了函数模板的提及。这些看起来很有希望。

0 投票
9 回答
17304 浏览

c++ - 模板还是抽象基类?

如果我想让一个类具有适应性,并且可以从外部选择不同的算法——C++ 中最好的实现是什么?

我主要看到两种可能性:

  • 使用抽象基类并传入具体对象
  • 使用模板

这是一个小例子,在各种版本中实现:

版本 1:抽象基类

版本 2a:模板

版本 2b:模板和私有继承

来自 Java,我自然倾向于总是使用版本 1,但模板版本似乎更受欢迎,例如在 STL 代码中?如果这是真的,仅仅是因为内存效率等(没有继承,没有虚函数调用)吗?

我意识到版本 2a 和 2b 之间没有太大区别,请参阅C++ FAQ

你能评论一下这些可能性吗?

0 投票
4 回答
828 浏览

.net - 在 .NET 中,当您将类实例/接口作为参数传递时,您是传递一个对象还是完整的 vtable

如果您将接口或类的实例作为参数传递,我们是在传递许多对象还是完整的 vtable,因为一旦您在实例上调用方法,它就需要递归 vtable 并调用适当的方法?
这是如何运作的?

0 投票
6 回答
30367 浏览

c++ - 多重继承+虚函数混乱

我有一个像这样的菱形多重继承场景:

公共父节点 A 定义了一个虚函数 fn()。
B和C都可以定义fn()吗?
如果是,那么下一个问题是 - D 可以无歧义地访问 B 和 C 的 fn() 吗?我假设这有一些语法..
D 是否有可能在不知道具体谁是 B 和 C 的情况下这样做?B 和 C 可以被其他一些类替换,我希望 D 中的代码是通用的。

我想要做的是让 D 以某种方式枚举它在其祖先中拥有的所有 fn() 实例。这是否可能以其他方式表示虚拟功能?