问题标签 [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.
c++ - 内联虚函数真的是无稽之谈吗?
当我收到一条代码审查评论说虚函数不需要内联时,我得到了这个问题。
我认为内联虚函数可以在直接在对象上调用函数的场景中派上用场。但我想到的相反论点是——为什么要定义虚拟然后使用对象来调用方法?
最好不要使用内联虚函数,因为它们几乎从未扩展过?
我用于分析的代码片段:
c++ - 为什么我的虚函数调用会失败?
更新:此问题是由于内存使用不当引起的,请参阅底部的解决方案。
这是一些半伪代码:
等效的 C# 如下:删除了 C# 示例,因为它与实际问题无关。
为什么ClassB::VirtualFunction
调用 from 时不调用函数ClassA::SomeFunction
?而是ClassA::VirtualFunction
被称为...
当我强制实现虚函数ClassA::VirtualFunction 时,如下所示:
尽管已明确声明和定义了派生函数,但在运行时仍会发生以下错误。
注意:似乎错误可能是由于内存使用不当引起的。有关详细信息,请参阅自我回答。
更新 1 - 4:
已删除评论(不相关)。
解决方案:
c# - 为什么 C# 默认将方法实现为非虚拟的?
与 Java 不同,为什么 C# 默认将方法视为非虚函数?是否更有可能是性能问题而不是其他可能的结果?
我想起了阅读 Anders Hejlsberg 的一段关于现有架构带来的几个优点的段落。但是,副作用呢?默认情况下使用非虚拟方法真的是一个很好的权衡吗?
java - 为什么所有 java 方法都是隐式可覆盖的?
在 C++ 中,我必须显式指定“虚拟”关键字以使成员函数“可覆盖”,因为当成员函数可覆盖时,会产生创建虚拟表和 vpointer 的开销(因此每个成员函数对于性能原因)。
当子类提供具有相同名称和签名的单独实现时,它还允许隐藏成员函数(如果未覆盖)。
C# 中也使用了相同的技术。我想知道为什么 Java 放弃了这种行为,并且默认情况下使每个方法都可以覆盖,并提供了在显式使用“final”关键字时禁用覆盖行为的能力。
c++ - 在构造函数中调用虚函数
假设我有两个 C++ 类:
如果我编写以下代码:
人们可能会期望将n
其设置为 2。
原来n
设置为 1。为什么?
c++ - 为什么虚拟分配的行为与相同签名的其他虚拟功能不同?
在玩实现虚拟赋值运算符时,我以一个有趣的行为结束。这不是编译器故障,因为 g++ 4.1、4.3 和 VS 2005 具有相同的行为。
基本上,就实际执行的代码而言,virtual operator= 的行为与任何其他虚函数不同。
效果是虚拟运算符 = 具有与具有相同签名的任何其他虚拟函数不同的行为([0] 与 [1] 相比),通过在通过真实派生对象调用时调用运算符的基本版本([1] ) 或派生引用 ([3]),而当通过基引用 ([2]) 调用时,或者当左值或右值是基引用而另一个是派生引用 ([4], [5])。
这种奇怪的行为有什么合理的解释吗?
c++ - 没有虚函数的命令模式 (C++)
出于性能原因,我使用Curiously Reoccuring Template Pattern来避免虚函数。我有很多执行数百万次的小命令。我正在尝试将其融入命令模式。我想将大量命令添加到队列中,然后逐个遍历它们执行。每个命令都使用 CRTP 来避免虚拟功能。我遇到的问题是命令模式通常是使用指针向量实现的。但是,当 Command 类被模板化后,就很难传递通用的 Command 指针。我不是 C++ 专家,所以也许有一种明显的方法来存储模板化命令对象的向量?我一直在尝试使用类似的东西:
问题Command
不是类型,所以Command* command
会出现编译错误。我需要使用Command<CommandType>
,但这不起作用,因为我需要队列来保存不同类型的命令。
任何解决方案的想法?还是虚拟功能是我唯一的选择?
添加:命令对象是蒙特卡罗模拟算法的一部分。所以你可能有,Command 是来自正态分布的随机数,其中正态分布的参数是类的一部分。所以命令模式非常适合。我有很多按特定顺序调用需要维护状态的函数。
c++ - 公共虚函数派生在 C++ 中的私有
我试图弄清楚当派生类将虚函数声明为私有时会发生什么。以下是我写的程序
令人惊讶的是(对我来说)输出是:
这是否违反了该功能的私有访问设置。这是预期的行为吗?这是标准的解决方法还是漏洞?通过 VTABLE 解析函数调用时是否绕过访问级别?
对此行为的任何见解都会非常有帮助。
此外,还提到私有覆盖虚拟成员将阻止其他类继承它。即使这样也有问题。修改上述程序以包括:
和主要测试程序:
输出是:
c# - c#中虚函数的实际使用
c#中虚函数的实际用途是什么?
c++ - C++中纯虚函数的用途是什么?
我现在在一堂课上学习 C++,我不太了解纯虚函数。我知道它们稍后在派生类中进行了概述,但是如果您只是要在派生类中定义它,为什么要将其声明为等于 0?