草庐IT

c++ - 在 NVI 惯用语下,为什么虚函数不能公开?

C++privateandprotectedvirtualmethod和Isthereanyvalidreasonfornotusingpublicvirtualmethods?正在谈论非虚拟接口(interface)(NVI)和非公共(public)虚拟功能及其共生。ScottMeyers在EffectiveC++中也说Sometimesavirtualfunctionevenhastobepublic,butthentheNVIidiomcan'treallybeapplied.我没看到的是为什么NVI要求实现特定的虚函数是非公开的?来自HerbSutter的文章Virtualit

c++ - MSVC 对象布局怪癖

我在C++中有一个简单的类,它有一个整数和一个vtable:classSomething{virtualvoidsampleVirtualMethod();intsomeInteger;};如果您查看MSVC的对象布局(使用/d1reportSingleClassLayout),您会得到:classSomethingsize(8):+---0|{vfptr}4|someInteger+---这是完全有道理的。4个字节用于vtable指针,4个字节用于整数。奇怪的是,当我向类(class)添加double时:classSomething{virtualvoidsampleVirtualM

c++ - 对模板的`vtable 的 undefined reference

我有一个继承自接口(interface)类的模板类,因此具有虚函数//abstract.hclassAbstract{virtualvoidabc();Abstract();}//Abstract.cppAbstract::Abstract(){//dosomeinit}//concrete.hclassImpl{public:voidabcImpl();};templateclassConcrete:publicAbstract,publicT{virtualvoidabc();};templateConcrete::abc(){static_cast(*this).abcImpl(

c++ - 继承和内联?

我最近一直在阅读大量书籍,在涉及继承(和虚函数)的同时,我不断地遇到“内联”关键字。现在我知道内联在正常意义上是什么了——编译器可能会用确切的代码替换函数调用。然而,我看到它提到的关于继承的次数——在继承中使用内联是否有一些特殊的原因?我不明白为什么一直提到它....内联函数在继承/派生类/虚函数中有什么额外的作用? 最佳答案 是的,在虚函数上使用内联是浪费时间。必须通过由函数指针组成的虚函数表来调用虚函数。指针不能调用内联函数。它必须作为一个真正的函数存在。有一些异常(exception)。如果调用者知道确切的对象类型,它可以完全

c++ - 如何绕过模板化成员函数不能为虚函数的限制进行设计

我遇到了一个设计问题(在C++中),我希望(非模板类的)模板化成员函数是虚拟的,并且想知道是否有一个好的、优雅的方法来解决这个问题。场景是这样的,我有机器可以处理通用项目。我为机器使用了一个抽象基类,带有一个虚拟的process(Item)函数,这样每台机器都可以定义自己独特的处理方法。问题在于这些项目也是“通用的”,因为它们公开了特定的接口(interface)以供处理。出于某些原因(主要是为了性能......没有vtable开销),我想对这些项目使用编译时多态性。这样现在每台机器都会有一个像这样的界面:classMachine{public:templatevirtualvoidp

c++ - 什么时候调用 __cxa_deleted_virtual

我尝试为avrc++构建构建一个小测试用例集。通常从c++库中提供一些“异常函数”。现在我想编写一个测试程序来生成必须链接到__cxa_deleted_virtual的错误代码。任何人都可以提供导致链接到该函数的代码片段吗?我实际上不知道如何生成这个“有问题”的代码。 最佳答案 用于填充已定义为已删除的虚函数的虚表槽:structB{virtualvoidf()=delete;};structD:B{virtualvoidf()=delete;};(被删除的虚函数包含在vtable中的原因是thisallowsittobelater

c++ - 更改现有对象 "on the fly"的 VTBL,动态子类化

考虑以下设置。基类:classThing{intf1;intf2;Thing(NO_INIT){}Thing(intn1=0,intn2=0):f1(n1),f2(n2){}virtual~Thing(){}virtualvoiddoAction1(){}virtualconstchar*type_name(){return"Thing";}}和派生类不同仅通过上述方法的实现:classSummator{Summator(NO_INIT):Thing(NO_INIT){}virtualvoiddoAction1()override{f1+=f2;}virtualconstchar*ty

C++ 多重虚拟继承与 COM

网络上充斥着对"dreadeddiamondproblem"的解释.StackOverflow也是如此。我想我有点理解,但我无法将这些知识转化为理解相似但不同的东西。我的问题一开始是一个纯C++问题,但答案很可能会分支到MS-COM细节。一般的问题是:classBase{/*purevirtualstuff*/};classDer1:Base/*Non-virtual!*/{/*purevirtualstuff*/};classDer2:Base/*Non-virtual!*/{/*purevirtualstuff*/};classJoin:virtualDer1,virtualDer

采用 STL 样式迭代器的 C++ 虚方法

我想要一个接口(interface)ModelGenerator,它有一个方法generate(),它接受一个可迭代的证据列表并创建一个模型。使用STLpseudo-duck-typing迭代器习惯用法...templateclassModelGenerator{public:templatevirtualboolgenerate(Iteratorbegin,Iteratorend,Model&model)=0;};但是虚函数不能模板化。所以我必须为整个类(class)制作模板:templateclassModelGenerator{public:virtualboolgenerate

c++ - 纯虚函数和覆盖函数 (c++)

我在互联网上寻找我的问题的答案,但找不到任何答案,所以我来了。为派生自纯虚拟的函数指定覆盖是否正确:classbaseClass{public:virtualvoidmyFunction()=0;}classderivedClass:publicbaseClass{public:virtualvoidmyFunction()override;}这是正确的吗?我的第二个问题是:即使没有类继承我的派生类(它将是最终的),我是否必须在我的函数的派生类中指定虚拟?非常感谢您的回答! 最佳答案 Isthiscorrect?Yes.Overri