virtual-functions相关内容

具有多重继承继承关系的 Liskov 替换原则

我正在尝试提出面向对象的设计,但难以满足 Liskov 替换原则.这是一个说明性示例: class 食物{上市:虚拟无效打印名称(){//......}};类水果:公共食品{};类肉类:公共食品{};类动物{上市:食物 *_preferredFood;virtual void setFoodPreference(Food *food)=0;};类食肉动物:公共动物{上市:void setFood ..
发布时间:2021-06-12 19:25:57 C/C++开发

我可以让 operator== 虚拟来实现平等吗?

从这个使用继承时实现 operator== 问题,我看到人们说operator== 不应该是 virtual(接受的答案甚至说“operators cannot be virtual",我发现这不是稍后为真): c++ 允许运算符是虚拟的.但我不会让它们成为虚拟的.多态性和运算符实际上并不能很好地结合在一起(并且自由运算符函数显然根本不能是虚拟的).---- 约翰内斯·绍布 - litb ..
发布时间:2021-06-12 19:18:50 C/C++开发

在windbg“x/2"中强制执行vftable条目结果,要考虑什么?

(这是一个关于软件设计的相当大的问题.如果它不适合 StackOverflow,我愿意将其复制到软件工程社区) 我正在使用 heap_stat,这是一个调查转储的脚本.该脚本基于这样的想法,对于任何具有虚函数的对象,vftable 字段始终是第一个字段(允许找到对象类的内存地址).> 在我的应用程序中,有一些对象具有 vftable 条目(通常每个 STL 对象都有),但也有相当多的对象没 ..
发布时间:2021-06-02 20:02:55 C/C++开发

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

抽象方法和虚拟方法之间有什么区别?建议在哪种情况下使用抽象或虚拟方法?哪一种是最好的方法? 解决方案 抽象函数不能具有功能.您基本上是在说,任何子类都必须提供自己的此方法版本.这太笼统了,甚至无法尝试在父类中实现. 虚拟功能基本上是说外观,以下功能对于子类而言可能足够好,也可能不够好.因此,如果足够好,请使用此方法;否则,请覆盖我并提供您自己的功能. ..
发布时间:2021-05-28 20:12:04 其他开发

从纯虚函数返回引用可以吗?

I类{上市:虚拟std :: wstring const&GetName()const = 0;}; 通常,实现此接口的客户端将其名称包含在其主体内.而且一切正常.但是有时,"GetName"的结果是在函数执行期间计算的.使用静态变量存储结果不是一个好主意.但是按值返回需要额外的性能开销. 那么如何解决这个问题?谢谢. 解决方案 但是按价值返回需要额外的性能开销. 这 ..
发布时间:2021-05-16 19:32:50 C/C++开发

如何使用G ++抑制纯虚拟类的C ++ vtable生成?

可以使用 __ declspec(novtable)属性在MSVC中完成C ++ vtable的生成.但是,似乎没有等效属性,GNU C ++编译器.事实是,将纯虚拟类的vtable不必要地链接到 __ cxa_abort()和许多其他链接中,并且我想避免这种情况的发生,因为我正在为嵌入式系统编程.那么,我该怎么办? struct ISomeInterface{虚拟void Func()= 0 ..
发布时间:2021-05-09 20:30:29 C/C++开发

如何实现设备端CUDA虚拟功能?

我看到CUDA不允许将带有虚函数的类传递到内核函数中.有没有解决此限制的方法? 我真的很希望能够在内核函数中使用多态性. 谢谢! 解决方案 罗伯特·克罗维拉(Robert Crovella)评论的最重要部分是: 只需在设备上创建对象即可. 因此请记住,我正在处理这样的情况:我有一个抽象的 class Function ,然后实现了一些封装了不同功能及其评估的实现.这 ..
发布时间:2021-04-27 20:06:45 其他开发

协变虚拟函数和智能指针

在C ++中,子类可以在重写虚拟函数时指定不同的返回类型,只要该返回类型是原始返回类型的子类(并且两者均作为指针/引用返回)即可. 是否可以将此功能扩展到智能指针?(假设智能指针是某些模板类) 说明: class retBase {...};class retSub:公共retBase {...};班级基础{虚拟retBase * f();};子类别:公共基地{虚拟retSub * ..

非平凡的副本构造函数做什么?

在C ++中,如果未定义副本构造函数,则编译器将为您执行此操作.如果定义了一个,则编译器不会.编译器生成的副本构造函数可以是平凡的或不平凡的.在琐碎的复制构造函数中,它会执行成员级复制.就是这样. 但是,如果有虚函数,则复制构造函数是不平凡的.它不能只是按位复制. 这是我的程序.没有什么特别的.只是为了说明我的观点. #include使用命名空间std;clas ..
发布时间:2021-04-24 20:06:05 C/C++开发

如果将虚函数或非虚函数添加到C ++中的基类中,是否必须重新编译整个类层次结构?

我试图了解一个类的vtable在C ++中的敏感程度,为此,我需要了解对于3种更改情况是否需要重新编译整个类层次结构(总共3个头文件)在下面列出.首先,这是我的班级层次结构: A类{上市:虚拟虚空method1()= 0;虚拟虚空method2()= 0;虚拟〜A(){}};B类:公共A {上市:virtual void method1(){};virtual void method2(){} ..
发布时间:2021-04-20 18:31:34 C/C++开发

创建没有抽象方法的抽象类

我有3个班级,A,B和C: A类{///一些代码};B级:公共A{///一些代码};C级:公共B{///一些代码}; 我想使A类和B类成为抽象类,以防止创建它们的实例,但是这两个类都没有抽象方法.即使没有抽象方法,也有办法使类抽象吗? 解决方案 如果您将这些类用作示例代码中所示的基类,则可能是虚拟析构函数.并且由于析构函数是一种方法,因此可以将其设为纯虚拟(“抽象")析构函数,以使 ..

虚函数调用的编译器优化

最流行的示例说明了为什么在运行时进行虚拟调度是在编译时无法确定要创建哪个派生类的情况.例如: Base * b =(rand()%2 == 1?new Derived1():new Derived2()); 或何时取决于用户输入. 假设情况并非如此,并且可以在编译时完全确定基本指针所指向的派生类. 如果在编译时知道基类指针指向哪个Derived类,编译器是否通过将虚拟函数调用替 ..
发布时间:2021-04-19 19:56:38 C/C++开发

如何用重载和重写方法解释此行为?

谁能这么好,请解释一下为什么这段代码显示 Derived.DoWork(double).我可以对此行为提出一些解释,但是我希望有人为我澄清一下. 使用系统;公共课基地{公共虚拟虚空DoWork(int param){Console.WriteLine("Base.DoWork");}}公共类派生:基础{公共重写void DoWork(int param){Console.WriteLine("D ..
发布时间:2021-04-18 19:34:50 C#/.NET