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

c++ - C++在子类中调用虚方法

我有以下课程:

当我使用时,inner->doSomething()我得到一个分段错误。我应该怎么做才能打电话inner->doSomething()到B班?

提前致谢。

0 投票
3 回答
3730 浏览

c# - c#继承类初始化

所以我有这门课

和另一个继承它的类

调用对象Line(true, 1, true, Color.Gray, true)时,它首先覆盖继承的类函数,然后设置stepstrue.

我想steps被包含在覆盖中,所以steps现在将true代替false(它的默认值)。

如果可能的话,请给我一些关于如何解决这个问题的指示和提示,并向我解释为什么我的设置不允许在构造函数初始化之后发生覆盖。

0 投票
2 回答
1122 浏览

c# - 虚拟方法/属性的后果

我最近在开发过程中一直在使用 Moq,我喜欢我能够实现的目标。

但是,我发现自己将我的方法(和大部分属性)虚拟化,以便我可以在测试中用模拟替换它们。

除了“你让你的所有方法和属性都可以覆盖”之外,这个行动过程有哪些现实世界的后果?

0 投票
3 回答
3207 浏览

c++ - C++ 基类如何在运行时确定方法是否已被覆盖?

下面的示例方法旨在检测它是否已在派生类中被覆盖。我从 MSVC 得到的错误意味着尝试将函数指针指向“绑定”成员是完全错误的,但我认为这应该是一个问题没有任何合乎逻辑的理由(毕竟,它将在this->vtable中)。有没有修复此代码的非 hacky 方法?

0 投票
9 回答
963 浏览

c++ - 无法理解 C++ `virtual`

我无法理解virtualC++ 中关键字的用途。我非常了解 C 和 Java,但我是 C++ 新手

来自维基百科

在面向对象的编程中,虚函数或虚方法是一种函数或方法,其行为可以在继承类中被具有相同签名的函数覆盖。

virtual但是我可以在不使用关键字的情况下覆盖如下所示的方法

正如您在下面看到的,函数 A::a 被 B::a 成功覆盖,而不需要virtual

让我更加困惑的是这个关于虚拟析构函数的声明,也来自维基百科

如以下示例所示,对于 C++ 基类,具有虚拟析构函数非常重要,以确保始终调用来自最派生类的析构函数。

那么virtual还告诉编译器调用父级的析构函数吗?这似乎与我最初对virtual“使函数可覆盖”的理解有很大不同

0 投票
2 回答
1213 浏览

c# - 从静态方法调用后代虚拟方法

首先让我们确定这一点。

我有

打电话有效吗

???

如果是这样,让我们​​扩展前面的示例:

我应该如何在基类中构造 StaticMethod,以便可以从派生类中使用 VirtualMethod?看来我今天的咖啡因太少/太多了,我什么都没有想到。

嗯,我知道我不能从静态方法调用实例方法。所以问题来了:

我可以从基类的静态方法创建派生类的实例吗?通过使用类似的东西:

为了说明的目的,我发明了新的关键字,派生。

顺便说一句,我会在这里支持基于非反射的解决方案!

0 投票
5 回答
420 浏览

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

在我的 C++ 程序中:

该语句应调用B::func(). 但是,该函数C::func()被调用。请对此有所了解。一旦在“class A”中删除了 virtual 关键字,就不会再发生这种情况了。

0 投票
2 回答
362 浏览

c++ - 纯虚函数

在 C++ 程序中:

如果虚函数 func() 在类 B 的主体中重新定义,则不会出错。但是在使用范围解析运算符时,编译器会抛出错误。这是为什么?

0 投票
5 回答
303 浏览

oop - 为什么热插拔 vtables 不是流行的语言功能?

在面向对象的编程中,有时能够修改已创建对象的行为是件好事。当然,这可以通过策略模式等相对冗长的技术来完成。但是,有时通过在实例化后更改 vtable 指针来完全更改对象的类型会很好。如果您从 A 类切换到 B 类,这将是安全的:

  1. B 类是 A 类的子类,不添加任何新字段,或
  2. B 类和 A 类具有相同的父类。除了覆盖父类的虚函数之外,什么都不做。(没有新字段或虚函数。)
  3. 在任何一种情况下,A 和 B 都必须具有相同的不变量。

这在 C++ 和 D 编程语言中是可以破解的,因为指针可以任意转换,但它是如此丑陋且难以理解,以至于我害怕在需要被其他人理解的代码中这样做。为什么通常不提供更高级别的方法来执行此操作?

0 投票
8 回答
10252 浏览

c++ - 虚拟方法或函数指针

在 C++ 中实现多态行为时,可以使用纯虚方法,也可以使用函数指针(或函子)。例如,可以通过以下方式实现异步回调:

方法一

所以要在这里使用回调,你需要重写 doGo() 方法来调用你想要的任何函数

方法二

要在此处使用回调方法,您需要创建一个回调对象调用的函数指针。

方法 3

[这是我(安德烈亚斯)添加到问题中的;不是原海报写的】

每种实现的优点和缺点是什么?