virtual相关内容

在C ++中虚拟函数实例化有什么区别?

以下两个声明有什么区别? virtual void calculateBase()= 0; virtual void calculateBase(); 我读取第一个(= 0)是一个“纯抽象函数第二个? 解决方案 第一个称为纯虚函数。通常纯虚函数不会有任何实现,你不能创建包含纯虚函数的类的实例。 第二个是一个虚函数正常“虚拟功能)。类提供了这个函数的实 ..
发布时间:2016-10-20 23:25:29 C/C++开发

如何在派生类上强制使用静态成员?

我有一个基类, Primitive ,从中导出其他几个类 - Sphere , Plane 等 原始强制执行一些功能, code> intersect(),在其子类上通过纯虚函数。 相交的计算取决于实例数据,因此将其作为成员方法是有意义的。 问题出现在以下: 我想让每个派生实例能够识别其类型,例如通过 std :: string type()成员方法。因为同一个类的所有实例将返回相同 ..
发布时间:2016-10-20 21:56:32 C/C++开发

虚拟函数和性能C ++

在你嘲弄重复的标题之前,另一个问题不适合我在这里问(IMO)。所以。 我真的想在我的应用程序中使用虚函数使事情更容易一百倍(不是那么简单的OOP)。但是我在某个地方看到了他们的性能成本,看到没有什么,只是同样老的炒作的过早优化,我决定给它一个快速的旋转在一个小的基准测试使用: CProfiler.cpp #include“CProfiler.h” CProfiler :: ..
发布时间:2016-10-20 09:30:33 C/C++开发

为什么需要虚拟关键字?

换句话说,为什么编译器不知道如果函数的定义在派生类中被改变,并且指向动态分配的该派生类的内存的指针调用被改变的函数,那么该函数 在什么情况下不会让虚拟关键字对程序员的好处起作用? 动态分派。 语言设计。 没有这样的关键字,编译器不知道是否实现动态分派。 virtual 或动态分派一般是 它具有轻微的性能损失。大多数编译器将使用vtable和vptr机制实现动态分派,其中通过v ..
发布时间:2016-10-19 21:01:35 C/C++开发

虚拟函数对象切片

我的问题是参考此问题,其中解释了虚拟函数在对象切片的情况下工作,最终调用基类虚拟函数和维基百科文章,其解释虚拟下面代码的派生类的表格布局 class A { public: virtual void func(){cout ..
发布时间:2016-10-19 20:55:58 C/C++开发

关于虚拟功能的成本

如果我在一个循环中调用一个虚函数1000次,我将遭受vtable查找开销1000次还是只有一次? 解决方案 Visual C ++编译器(至少通过VS 2008)不缓存vtable查找。更有趣的是,它不会将调用直接调度到虚拟方法,其中对象的静态类型是密封。然而,虚拟分派查找的实际开销几乎总是可忽略的。你有时候看到命中的地方是,C ++中的虚拟调用不能被直接调用替代,就像在受管理的VM中一样 ..
发布时间:2016-10-19 20:17:03 C/C++开发

类体外的模板定义

是吗?定义类模板的虚函数在其体外?虚函数不能被内联,但是为了避免编译单元中的多个定义,它们应该标记为 inline (假设模板头将被包括在多个源文件中)。另一方面,编译器可以忽略 inline ,所以这似乎有效。例如,下面的代码是正确的: template class C { public: virtual void f(T val); }; ..
发布时间:2016-10-19 20:08:56 C/C++开发

虚函数的Vtable如何工作

在虚拟表中有一个小小的疑问,每当编译器遇到一个类中的虚函数时,它会创建Vtable并将虚函数地址放在那里。它对于继承的其他类发生类似。它是否在每个类中创建一个指向每个Vtable的新指针?如果没有,当创建派生类的新实例并分配给Base PTR时,如何访问Virtual函数? 解决方案 你创建一个包含虚函数的类,或者 从包含虚函数的类派生,编译器 为该类创建一个唯一的VTABLE。 ..
发布时间:2016-10-19 19:51:04 C/C++开发

虚拟基类数据成员

为什么建议不要在虚拟基类中有数据成员? 函数成员呢? 如果我有一个任务通用于所有派生类是否可以为虚拟基类做任务,或者派生继承自两个类 - 从虚拟接口和普通基本任务? 感谢。 解决方案 作为一种做法,你应该只使用虚拟继承来定义接口它们通常与多重继承一起使用,以确保在派生类中只存在该类的一个版本。纯接口是多重继承的最安全的形式。当然,如果你知道你在做什么,你可以使用多重继承,如果 ..
发布时间:2016-10-17 11:08:09 C/C++开发

纯虚函数在C ++ 11

在C ++ 98中,空指针由文字 0 (或实际上任何值为零的常量表达式)表示。在C ++ 11中,我们更喜欢 nullptr 。但这不适用于纯虚函数: struct X { virtual void foo )= nullptr; }; 为什么不起作用?这不会完全有道理吗?这只是一个监督吗? 因为语法 0 ,不会修改 或其他非终端匹配 nullptr 。 ..
发布时间:2016-10-17 09:52:31 C/C++开发

C ++程序中的虚拟表和虚拟指针数

假设我们有以下程序: class A {public: virtual fun ){}; }; class B:public A {public: virtual fun(){}; }; int main() { A a1; B b1; } 我的问题是多少 vtables 解决方案 div> 它严重依赖于实现,但通常你会得到 ..
发布时间:2016-10-17 09:22:30 C/C++开发

为什么vptr不是静态的?

每个包含一个或多个虚函数的类都有一个与它相关的V表。一个名为vptr的void指针指向该vtable。该类的每个对象都包含指向同一个Vtable的vptr。那么为什么vptr不是静态的呢?而不是将vptr与对象关联,为什么不将它与类关联? 解决方案 对象的运行时类是对象本身的属性。实际上, vptr 表示运行时类,因此不能是 static 。但是,它指向的是同一个运行时类的所有实例可以共享 ..
发布时间:2016-10-17 09:16:07 C/C++开发