virtual-functions相关内容

Haskell 面向对象编程

我正在尝试了解 Haskell 中面向对象风格的编程,因为我知道由于缺乏可变性,情况会有所不同.我玩过类型类,但我对它们的理解仅限于它们作为接口.所以我编写了一个 C++ 示例,它是具有纯基础和虚拟继承的标准菱形.Bat继承了Flying和Mammal,Flying和Mammal都继承了动物. #include 类动物{上市:虚拟 std::string 传输()const = 0;虚拟 std ..
发布时间:2021-12-14 11:56:49 C/C++开发

虚方法和抽象方法的区别

这是来自 MSDN 的一些代码: //编译:/target:library公开课 D{public virtual void DoWork(int i){//原始实现.}}公共抽象类 E : D{公共抽象覆盖 void DoWork(int i);}公开课 F : E{公共覆盖无效 DoWork(int i){//新的实现.}} 谁能解释一下上面代码中抽象方法和虚拟方法的区别? 解决方案 ..
发布时间:2021-12-12 08:14:20 C#/.NET

在 C++ 类中使用虚方法的性能成本是多少?

在 C++ 类(或其任何父类)中至少有一个虚拟方法意味着该类将有一个虚拟表,并且每个实例都有一个虚拟指针. 所以内存开销就很清楚了.最重要的是实例的内存成本(特别是如果实例很小,例如如果它们只是打算包含一个整数:在这种情况下,在每个实例中都有一个虚拟指针可能会使实例的大小增加一倍.至于虚拟表使用的内存空间,我想与实际方法代码使用的空间相比,通常可以忽略不计. 这让我想到了一个问题:使方 ..
发布时间:2021-12-08 11:56:56 C/C++开发

虚函数和性能 - C++

在我的类设计中,我广泛使用抽象类和虚函数.我有一种感觉,虚函数会影响性能.这是真的?但我认为这种性能差异并不明显,看起来我正在做过早的优化.对吗? 解决方案 一个好的经验法则是: 除非你能证明它,否则这不是性能问题. 使用虚函数会对性能产生非常轻微的影响,但不太可能影响应用程序的整体性能.寻找性能改进的更好的地方是算法和 I/O. 一篇关于虚函数(以及更多)的优秀文章是成 ..
发布时间:2021-12-08 11:32:31 C/C++开发

在构造函数中调用虚函数

假设我有两个 C++ 类: A 类{民众:A() { fn();}虚拟无效 fn() { _n = 1;}int getn() { 返回 _n;}受保护:国际_n;};B类:公共A{民众:B() : A() {}虚拟无效 fn() { _n = 2;}}; 如果我写如下代码: int main(){乙乙;int n = b.getn();} 人们可能期望 n 设置为 2. 结果 n ..
发布时间:2021-12-01 14:53:47 C/C++开发

为什么我们需要 C++ 中的虚函数?

我正在学习 C++,我刚刚接触虚函数. 根据我所读到的(在书中和在线),虚函数是基类中的函数,您可以在派生类中覆盖它们. 但在本书前面,在学习基本继承时,我能够在不使用 virtual 的情况下覆盖派生类中的基函数. 那么我在这里错过了什么?我知道虚函数还有更多,而且它似乎很重要,所以我想弄清楚它到底是什么.我只是在网上找不到直接的答案. 解决方案 这里是我理解的不只是什 ..
发布时间:2021-12-01 14:47:55 C/C++开发

为什么虚函数不能使用返回类型推导?

n3797 说: 第 7.1.6.4/14 节: 使用占位符类型的返回类型声明的函数不得是虚拟的 (10.3). 因此以下程序格式错误: struct s{虚拟汽车 foo(){}}; 我所能找到的理由是来自 n3638: 虚拟 允许虚拟的返回类型推导是可能的函数,但这会使覆盖检查和 vtable 复杂化布局,因此似乎最好禁止这样做. 谁能提供进一步的理由或 ..
发布时间:2021-11-30 18:16:03 C/C++开发

用 C++ 中的私有函数覆盖公共虚函数

是否有任何理由使重写的 C++ 虚拟函数的权限与基类不同?这样做有什么危险吗? 例如: 类基{民众:虚拟 int foo(double) = 0;}班级孩子:公共基地{私人的:虚拟 int foo(double);} C++ faq 说这是个坏主意,但没有说明原因. 我在一些代码中看到过这个习语,我相信作者试图使类成为最终的,这是基于不可能覆盖私有成员函数的假设.但是,本文展示了一 ..
发布时间:2021-11-26 18:37:54 C/C++开发

在 C++ 中使用接口的性能损失?

在 C++ 中使用接口(抽象基类)时是否有运行时性能损失? 解决方案 简短回答:否 长答案:影响速度的不是基类或类在其层次结构中的祖先数量.唯一的问题是方法调用的成本. 非虚方法调用有成本(但可以内联) 虚拟方法调用的成本稍高,因为您需要在调用之前查找要调用的方法(但这是一个简单的表查找不是搜索).由于接口上的所有方法根据定义都是虚拟的,因此存在此成本. 除非您正在编写 ..
发布时间:2021-11-26 16:52:43 C/C++开发

为什么 C# 接口方法没有声明为抽象或虚拟?

接口中的 C# 方法不使用 virtual 关键字声明,并在派生类中覆盖而不使用 override 关键字. 这是有原因的吗?我认为这只是一种语言方便,显然 CLR 知道如何在幕后处理这个问题(默认情况下方法不是虚拟的),但还有其他技术原因吗? 这是派生类生成的 IL: class 示例:IDisposable {公共无效处置(){}}.method public hidebysig ..
发布时间:2021-11-26 16:09:54 C#/.NET

抽象方法和虚方法有什么区别?

抽象方法和虚方法有什么区别?在哪些情况下建议使用抽象方法或虚拟方法?哪种方法最好? 解决方案 抽象函数不能具有功能性. 您基本上是说,任何子类都必须提供自己版本的此方法,但是甚至尝试在父类中实现都太笼统了. 虚函数,基本上是说看,这里的功能对于子类来说可能不够好,也可能不够好.所以如果够好就用这个方法,如果不行就覆盖我,提供你自己的功能. ..
发布时间:2021-11-26 16:09:08 其他开发

你能在 C++ 中缓存一个虚函数查找吗?

假设我在抽象基类指针 mypointer->foo() 上有一个虚函数调用 foo().当我的应用程序启动时,根据文件的内容,它选择实例化一个特定的具体类并将 mypointer 分配给该实例.在应用程序的剩余生命周期中,mypointer 将始终指向该具体类型的对象.我无法知道这个具体类型是什么(它可能由动态加载库中的工厂实例化).我只知道在第一次创建具体类型的实例后,类型将保持不变.指针可能并 ..

如何在 C++ 中为孙子级覆盖超类的虚函数?

大家好,这里有一些我将要运行的代码,问题是它没有按照我想要的方式工作.我无法弄清楚它有什么问题.我是 C++ 菜鸟,请帮忙. #include #include #include 使用命名空间标准;/*** 超级班*/班级形状{受保护:int _dimensions;民众:形状() : _dimensions{0}{};形状(int 暗淡):_dimensions{暗淡}{};虚拟 ..
发布时间:2021-11-25 09:55:31 C/C++开发

在 C++ 中使用接口的性能损失?

在 C++ 中使用接口(抽象基类)时是否有运行时性能损失? 解决方案 简短回答:否 长答案:影响速度的不是基类或类在其层次结构中的祖先数量.唯一的问题是方法调用的成本. 非虚方法调用有成本(但可以内联) 虚拟方法调用的成本稍高,因为您需要在调用之前查找要调用的方法(但这是一个简单的表查找不是搜索).由于接口上的所有方法根据定义都是虚拟的,因此存在此成本. 除非您正在编写 ..
发布时间:2021-11-25 09:26:08 C/C++开发

为什么 C# 接口方法没有声明为抽象或虚拟?

接口中的 C# 方法不使用 virtual 关键字声明,并在派生类中覆盖而不使用 override 关键字. 这是有原因的吗?我认为这只是一种语言方便,显然 CLR 知道如何在幕后处理这个问题(默认情况下方法不是虚拟的),但还有其他技术原因吗? 这是派生类生成的 IL: class 示例:IDisposable {公共无效处置(){}}.method public hidebysig ..
发布时间:2021-11-25 08:42:41 C#/.NET

抽象方法和虚方法有什么区别?

抽象方法和虚方法有什么区别?在哪些情况下建议使用抽象方法或虚拟方法?哪种方法最好? 解决方案 抽象函数不能具有功能性. 您基本上是说,任何子类都必须提供自己版本的此方法,但是甚至尝试在父类中实现都太笼统了. 虚函数,基本上是说看,这里的功能对于子类来说可能不够好,也可能不够好.所以如果够好就用这个方法,如果不行就覆盖我,提供你自己的功能. ..
发布时间:2021-11-25 08:41:59 C#

Arduino C++ 代码:你能使用虚函数和异常吗?

跟进此评论来自问题写固件:汇编还是高级?: 在为 Arduino 平台编译 C++ 代码时,是否可以使用虚函数、异常等?或者您想(必须)使用 C++ 的子集(如 中所述)评论)? 在为 Arduino 平台编程时还有其他注意事项吗? 解决方案 Arduino 环境使用 GCC 工具链的 AVR 版本.代码编译为 C++,因此您可以使用类.虚拟功能是可能的;vtables 将存储 ..
发布时间:2021-11-17 03:42:09 C/C++开发

虚函数的成本是否随着继承树中类的数量增加而增加?

正如标题所说,例如有 8 个带虚函数的派生类是否比有 2 个派生类对性能的影响更大?如果是这样,差异可以忽略不计吗? 那么多重继承(非虚拟继承)呢? 提前致谢. 解决方案 C++ 中动态调度的常见实现是通过一个虚表,它基本上是一个指向函数的指针数组,每个虚函数对应一个指针.类型.继承链的长度无关紧要,因为 vtable 只保存一个指针,即完整对象中该特定函数的最终覆盖的指针.无 ..
发布时间:2021-09-18 18:47:30 C/C++开发