草庐IT

polymorphism

全部标签

c++ - 为什么 `std::pmr::polymorphic_allocator` 不会在容器移动时传播?

来自http://en.cppreference.com/w/cpp/memory/polymorphic_allocator:polymorphic_allocatordoesnotpropagateoncontainercopyassignment,moveassignment,orswap.Asaresult,moveassignmentofapolymorphic_allocator-usingcontainercanthrow,andswappingtwopolymorphic_allocator-usingcontainerswhoseallocatorsdonotcomp

c++ - 基类中的非虚析构函数,但派生类中的虚析构函数导致段错误

最近在一次工作面试中,我被问及当基类的析构函数未声明为虚拟时派生类中内存泄漏的问题。我写了一个小测试来确认我的答案,但我发现了一些有趣的东西。显然,如果您通过new创建一个Derived对象,但将其指针存储为Base*,则不会调用派生对象的析构函数,如果指针被删除(我对问题的回答就这么多)。我认为在这种情况下派生类的析构函数是否为虚函数无关紧要,但在我的系统上,以下代码显示了其他情况:#include#include//justahelperclass,printingitsnameoutwhenitisdestructedclassPrintOnDestruct{public:Pri

c++ - 具有派生成员函数指针的多态性?

(我看到之前有人在SO上提出过类似的问题,但我看到的问题似乎并没有完全触及我的用例。特别是,我想知道我的编译失败是错误的结果,或者是我尝试的结果是verboten。)背景我希望实现委托(delegate)模式,用于事件处理。我认为也许满足我需求的最佳方法是成员函数指针映射,由std::string索引(代表事件类型。)我开始尝试使用std::function来完成此操作,但遇到了一些问题,然后决定仅使用原始MFP进行尝试。(我仍然愿意考虑std::function,我会接受一个答案,该答案显示了如何使用该方法在下面完成我的确切需求。但我仍然想知道有什么问题我目前的方法。)我能够通过一个

c++ - 通过引用传递派生类到以基类为参数的函数

考虑以下代码:classA{public:virtual~A(){}virtualvoidprint()const{std::coutprint();}voiddoSomething(constAa){a.print();}intmain(){A*a=newB();doSomething(a);doSomething(B());return0;}为什么会这样输出:InBInA但是当您将doSomething更改为doSomething(constA&a)时,它会输出:InBInB 最佳答案 这称为切片。当按值传递A时,通过仅复制调用

c++ - 不能使用值但引用和指针的多态性的原因

我在下面找到帖子C++polymorphismwithoutpointers这说明C++具有多态特性必须使用指针或引用类型。我查看了一些进一步的资源,他们都说了同样的原因。支持带值的多态性是否存在任何技术困难,或者有可能但C++已决定不提供该功能? 最佳答案 多态处理值的问题归结为objectslicing问题:因为派生对象可能比它们的基类使用更多的内存,所以在自动存储中(即在堆栈上)声明一个值会导致只为基类分配内存,而不是为派生对象分配内存。因此,属于派生类的对象部分可能会被切掉。这就是为什么C++设计者有意识地决定将虚拟成员函数

c++ - 我避免 dynamic_cast<> 的方法是否比 dynamic_cast<> 本身更快?

我正在回答question几分钟前,它向我提出了另一个问题:在我的一个项目中,我做了一些网络消息解析。消息采用以下形式:[1bytemessagetype][2bytespayloadlength][xbytespayload]有效载荷的格式和内容由消息类型决定。我有一个基于公共(public)类的类层次结构Message.为了实例化我的消息,我有一个返回Message*的静态解析方法取决于消息类型字节。像这样的东西:Message*parse(constchar*frame){//Thisissamplecode,inreallifeIobviouslycheckthatthebuf

c++ - 这种设计是否过度工程化?

您会考虑使用接口(interface)和多态性来扩展这种过度工程化的设计吗?优点可扩展封装自动魔法缺点更多代码使用起来有点笨重(您必须使用不同的类型名称才能获得不同的行为)可能由于虚函数调用而使用效率较低。我的直觉是,对于这种特殊情况,单个if语句和一个bool标志是更好的选择,但并不是每个人都同意我的看法。你怎么想?原创//Connectstoalocalpipe,andnaturally//ownsthatconnectionstructCommandWriter{CommandWriter(){fd=open("/path/to/fifo",O_WRONLY);if(fd==-1

c++ - 找出多态对象的大小

我有一个指向多态对象的指针Base*base_ptr。是否可以找出所述对象的动态类型的大小?AFAIK,sizeof(*base_ptr)产生base_ptr静态类型的大小。我开始怀疑这是不可能的,但也许我忽略了一些东西。注意:我知道我可以向我的类型层次结构添加一个虚函数来返回大小,但这不是我的理想解决方案。编辑:sizeof(base_ptr)->sizeof(*base_ptr) 最佳答案 不,您不能在C++中这样做-至少以可移植的方式。最好的办法是在每个类中实现getSize()成员函数。

c++ - 为什么虚函数需要通过指针而不是(对象的)值传递?

我想我理解虚拟方法和vtables的概念,但我不明白为什么将对象作为指针(或引用)传递和按值传递(哪种废弃vtable或什么?)为什么这样的东西会起作用:Material*m=newTexture;poly->setMaterial(m);//methodsfromTexturearecalledifIkeepcarryingthepointeraround而不是这个?Materialm=Texture();poly->setMaterial(m);//methodsfromMaterialarecalledifIpassthevaluearound 最佳答

c++ - 无重复代码的多态函数调用

假设一个层次结构的所有类都实现了一个模板成员函数g。所有类共享调用此模板的另外两个函数f1和f2的相同实现:structA{virtualvoidf1(){g(5);}virtualvoidf2(){g(5.5);}private:templatevoidg(T){std::coutvoidg(T){std::coutvoidg(T){std::cout由于f1和f2的实现在所有类中都是相同的,我怎样才能摆脱重复的代码并仍然在中进行多态调用main按预期工作(即产生输出“InB”)? 最佳答案 请注意f1的实现和f2在A,B,和C不