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

c++ - C++ 中虚函数的行为

我有一个问题,这里有两个类:

问题是:

  • 如果我想派生类的子类使用Base类型的指针执行多态性,括号中的关键字 virtual 是否必要?

  • 如果答案是否定的,那么带和不带 virtual的Derive类的成员函数toString有什么区别?

0 投票
1 回答
2699 浏览

c++ - 指向丢失 vfptr 的派生类对象的指针

首先,我正在尝试编写一个普通的、简单的 Ray Tracer。在我的 Ray Tracer 中,我在世界上有多种类型的几何图形,它们都派生自一个名为“SceneObject”的基类。我在这里包含了它的标题。

如您所见,我已经包含了几个要在其他地方实现的虚函数。在这种情况下,我只有两个派生类——Sphere 和 Triangle,它们都实现了缺少的成员函数。最后,我有一个 Parser 类,其中充满了执行实际“光线追踪”部分的静态方法。这是相关部分的几个片段

现在,我放弃了真正的光线追踪部分,而是简单地返回第一个命中对象的颜色,如果有的话。毫无疑问,您已经注意到,计算机知道射线与对象相交的唯一方法是通过我也包括在内的 Scene.intersect()。使用的成员变量是“向量对象”见结尾

好的,现在解决问题。我首先创建一个场景并用 Parser::trace() 方法之外的对象填充它。现在由于一些奇怪的原因,我为 i=j=0 投射了 Ray,一切都运行得很好。但是,当第二条射线被投射时,存储在我的场景中的所有对象都不再识别它们的 vfptr(也就是说,我仍然可以访问所有的 SceneObject 方法,除了那些虚拟的方法)!我使用调试器单步执行代码,发现所有 vfptr 的信息在 getColor() 结束和循环继续之间的某处丢失。但是,如果我将 getColor() 的参数更改为使用 Scene& 而不是 Scene,则不会发生任何损失。这是什么疯狂的巫术?

场景代码,根据要求:

0 投票
3 回答
37436 浏览

c++ - QWidget keyPressEvent 覆盖

我正在尝试半个永恒,现在在 QT 中覆盖 QWidgets keyPressEvent 函数,但它只是行不通。我不得不说我是 CPP 的新手,但我知道 ObjC 和标准 C。

我的问题是这样的:

QSGameBoard 是我的 QWidget 子类,我需要覆盖 keyPressEvent 并在每个事件上触发一个 SIGNAL 以通知一些已注册的对象。

我在 QSGameBoard.cpp 中覆盖的 keyPressEvent 如下所示:

当我将 QSGameBoard:: 更改为 QWidget:: 时,它会接收事件,但我无法发出信号,因为编译器会抱怨范围。如果我这样写,则根本不会调用该函数。

这里有什么问题?

0 投票
5 回答
199 浏览

c++ - 关于虚拟方法的问题

如果这两个方法都被声明为虚拟的,那么被调用的 Method1() 的两个实例不应该是派生类的 Method1() 吗?

我每次都看到 BASE 然后 DERIVED 调用。我正在为面试做一些复习,我想确保我明白这一点。xD

方法 1 基础
方法 1 衍生

0 投票
2 回答
2095 浏览

c++ - 访问者和模板化虚拟方法

访问者模式的典型实现中,类必须考虑基类的所有变体(后代)。在很多情况下,访问者中的相同方法内容应用于不同的方法。在这种情况下,模板化的虚拟方法是理想的,但目前还不允许这样做。

那么,模板化的方法可以用来解析父类的虚方法吗?

给定(基础):

现在奠定了基础,这就是踢球者的用武之地(模板化方法):

故意在方法声明Visitor_Cout中不包含关键字。virtual方法签名的所有其他属性都与父声明(或规范)匹配。

总体而言,这种设计允许开发人员实现仅因目标对象(接收访问的对象)类型不同而不同的通用访问功能。上面的实现是我对派生访问者实现未实现可选方法时的警报的建议。

这在 C++ 规范中合法吗?

(我不相信有人说它可以与编译器XXX一起使用。这是一个针对通用语言的问题。)

0 投票
7 回答
1616 浏览

c - 虚函数 == 函数指针?

组合成数据结构的一组函数指针通常称为虚拟函数表 (VFT)。

上面的说法让我觉得virtual function == function pointer,是这样吗?

0 投票
5 回答
500 浏览

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

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

虚函数呢???

有没有两者不可替代的情况?

0 投票
7 回答
9801 浏览

c++ - 为什么我必须在覆盖 [C++] 时重新声明一个虚函数

上面的代码无法编译。但是,当我在子类中声明虚函数时,它编译得很好。

如果编译器已经具有子类将覆盖的函数的签名,那么为什么需要重新声明?

有什么见解吗?

0 投票
2 回答
1988 浏览

c++ - 在类之外调用虚函数的语法?

在类体之外定义虚函数的语法是什么?

是吗?

?

0 投票
3 回答
640 浏览

c++ - 抽象类引用

我可以上课吗

教室{~Room(); 虚拟成本()=0;}

一流酒店{ 地图房间;/* */ };

我的酒店会变得抽象吗?它可以保存从 Room 派生的具体 Room 对象的列表吗?