问题标签 [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 投票
2 回答
79 浏览

c++ - 以下前向声明的多继承指针转换代码如何工作?

在下面的代码中,指针转换和多继承如何一起发挥作用?

我的理解有点不稳定。

一方面, someWork 对 Bar 一无所知,所以这应该行不通;但另一方面,我已经提前声明了 Bar。

谢谢!

0 投票
4 回答
16793 浏览

c++ - 虚拟表 C++

我读到很多人在写“一个虚拟表存在于一个类中,该类中声明了一个虚函数”。

我的问题是,vtable 是否只存在于具有虚函数的类,或者它是否也存在于从该类派生的类。

例如

问题:如果没有用于派生类的 vtable,那么输出就不会是“派生打印”。因此,IMO 对于任何声明了虚函数的类以及从该类继承的类都存在一个 vtable。它是否正确 ?

0 投票
3 回答
220 浏览

c++ - 具有两个可以采用多种不同类型的操作数的虚函数

让我从一个具体的例子开始。在 C++ 中,我在抽象基类下有一个类层次结构CollisionVolume。任何碰撞体积都需要能够detectCollision与任何其他体积。这个碰撞代码是专门基于存在的两个子类的,但它是可交换的:detectCollision(a, b) == detectCollision(b, a).

我需要使用类似于虚函数的机制,因为对象通常属于抽象基类。但是,如果我使用典型的虚方法,则选择的函数只能取决于操作数之一的类型,而不是两者。我能够做到这一点的唯一方法是使用 RTTI 或类似 RTTI 的机制。

有没有更清洁的方法来做到这一点?

0 投票
3 回答
103 浏览

c++ - 检测拼写错误的虚函数

我不止一次被这个问题所困扰:

如果函数是纯虚函数,编译器会捕获错误。但如果不是这样,这可能是一个可怕的错误。部分问题是函数名称可能太长了。但我仍然想知道,有没有办法更早地看到这些错误?

0 投票
10 回答
9163 浏览

c++ - 为什么我们实际上有虚函数?

我是 C++ 新手。

谁能告诉我 C++ 中方法覆盖和虚函数概念之间的区别。

虚函数的功能可以在其派生类中被覆盖。在派生类中重新定义函数称为函数覆盖。

为什么我们实际上有虚函数?

0 投票
4 回答
156 浏览

c++ - 是否存在类声明虚拟方法而编译器不需要使用 vptr 的情况?

我想知道是否有可能的优化,即使对象的类型是具有虚拟方法的类,编译器也不需要将 vptr 分配给实例化对象。

例如考虑:

在这个例子中,编译器在编译时肯定知道 pFoo 的类型是什么,所以它不需要为 pFoo 使用 vptr,对吧?有没有更有趣的情况,编译器可以避免使用 vptr?

0 投票
5 回答
541 浏览

c++ - 从基类解析 C++ 虚函数

对不起,如果这是一个骗局,我找不到完全正确的答案。

我想从基类成员调用一个函数,并将其解析为子类版本。我以为宣布它是虚拟的就可以了,但事实并非如此。这是我的方法:

我究竟做错了什么?

非常感谢

0 投票
15 回答
237159 浏览

c++ - 类成员函数模板可以是虚拟的吗?

我听说 C++ 类成员函数模板不能是虚拟的。这是真的?

如果它们可以是虚拟的,那么使用这种功能的场景示例是什么?

0 投票
3 回答
2897 浏览

c++ - 在成员函数内部调用虚函数

我正在阅读Bruce Eckel的《用 C++ 思考》 。在第 15 章(第 1 卷)的“构造函数内部虚函数的行为”标题下,他说

如果您在构造函数中并调用虚函数会发生什么?在一个普通的成员函数中,你可以想象会发生什么——虚拟调用在运行时被解析,因为对象不知道它是属于成员函数所在的类,还是从它派生的某个类。为了一致性,您可能认为这是在构造函数内部应该发生的事情。

在这里,Bruce 试图解释当您在对象的构造函数中调用虚函数时,不会表现出多态性,即只会调用当前类的函数,而不会是该函数的其他派生类版本。这是有效的,我可以理解,因为类的构造函数不会事先知道它是为它运行还是为其他衍生对象的创建运行。此外,如果这样做,它将在部分创建的对象上调用函数,这是灾难性的。

虽然我的困惑突然出现,因为他在第一句话中陈述了普通成员函数,他说虚拟调用将在运行时解决。但是等等,在一个类的任何成员函数中,当你调用另一个函数(无论是虚拟的还是非虚拟的)时,它自己的类版本只会被调用,对吧?例如

在上面的代码中,A::add()当调用到时subadd(),它总是会调用A::subadd(),同样适用B,对吧?那么“虚拟调用在运行时解决,因为对象不知道它属于成员函数所在的类,还是从它派生的某个类”是什么意思?

他是在通过基类指针的调用来解释它吗?(我真的很怀疑)在这种情况下,他不应该写“在普通成员函数中”;据我目前的理解,从同一类的另一个成员函数内部对成员函数的任何调用都不是多态的,如果弄错了,请纠正我。

0 投票
3 回答
11280 浏览

c# - 用受保护的内部保护!

这是一个小时前提出的extension这个问题。

在类中access modifiers覆盖 a 时,我们不能修改, 。考虑命名空间中的类virtual methodderivedControlSystem.Web.UI

现在考虑这个

任何机构都可以解释这一点吗?谢谢