jjzjj

polymorphism

全部标签

C++ - 通过单个指针访问多个对象的接口(interface)

我需要存储一个对象指针容器。这些对象有一些我想要强制执行(可能在编译时)和使用的通用方法/属性(接口(interface))。示例:structA{voidfly(){}};structB{voidfly(){}};Aa;Bb;std::vectorobjects;objects.push_back(&a);objects.push_back(&b);for(auto&el:objects)el->fly();更简单的解决方案是A和B继承一个共同的基类,如FlyingClass:structFlyingClass{voidfly(){}};structA:publicFlyingCla

c++ - 覆盖 operator new 以合并 PIMPL 分配

PIMPL习语通常用于对象的公共(public)API,有时也包含虚函数。在那里,堆分配通常用于分配多态对象,然后将其存储在unique_ptr或类似的地方。一个著名的例子是QtAPI,其中大多数对象(尤其是QWidgets等)在堆上分配并由QObject父/子关系跟踪。因此,我们为两次分配支付费用,一次是对象本身使用2*sizeof(void*)来保存PIMPL和v_table指针,一次是私有(private)数据本身。现在来回答我的问题:我想知道这两个分配是否可以合并,类似于make_shared应用的优化。然后我想知道这种优化是否值得,因为malloc的实现可能非常擅长处理字大小

c++ - 设计一个将两个抽象基类对象作为参数的函数,并根据对象的派生类做不同的事情

==编辑3==最后,我只是在Shape和checkIntersect(Shape)中添加了一个抽象方法和让他们调用我的免费(非成员)函数,这些函数已经在一个地方实现,同时使用一些预处理器和头文件技巧来为自己保存一些重复代码,以防我需要添加其他子类。为了完成起见,我将标记Jeffrey的回答,因为他的回答最接近我所做的,但是我感谢你们所有人向我展示了一些我实际上不知道的很酷的东西(函数模板)并将我链接到其他2个问题也提出了Visitor/Doubledispatch作为解决方案。虽然我不得不说,但我希望我们能尽快在C++中看到多方法。==编辑结束==所以我有一个基类Shape及其子类:T

c++ - 支持多态的Stored-by-Value Pool,如何使用智能指针?

介绍我有一个数据结构:值池。(不是指针池)当我调用create()时,它会返回Handle。到目前为止一切都很好。templateclassPool{std::vectorv;//storebyvalueHandlecreate(){....}}templateclassHandle{Pool*pool_;//pointerbacktocontainerintpool_index_;//whereIaminthecontainerT*operator->(){returnpool_->v.at(pool_index_);//i.e."pool[index]"}voiddestroy()

C++ 转换为基类

这个问题在这里已经有了答案:Whatisobjectslicing?(18个答案)关闭5年前。我有一个基类A和一个派生类B。classA{public:intx;virtualintgetX(){returnx;}};classB:publicA{public:inty;};虚函数只是为了让它多态。接下来我声明一个A的列表,但将B放在里面:vectorlist;Bb1,b2;b1.y=2;b2.x=10;list.push_back(b1);list.push_back(b2);现在我想遍历vector上的所有元素并访问y成员(只有B有):for(autoit=list.begin()

c++ - 指向抽象类的指针 vector ,用于访问派生类成员

我是C++的新手,正在尝试实现一个turtle模拟器,它将从文本文件中读取命令,将它们放在一个vector上并使用glut绘制它们我有节点类、从节点派生的命令类、来自命令的4个派生类(forward、left、right、jump、repeat)和用于存储命令的Prog类。classnode{public:node();virtual~node();virtualvoidRun()=0;};classcommand:publicnode{private:floatv;public:command();command(float);~command();virtualvoidRun();

c++ - 使库函数使用从库类派生的类

我有一个可以自己构建的.dll。我有一个类Lion,派生自库中的一个类Cat,它覆盖了一个虚函数Leap()。我想创建一个Lion类型的对象,将它传递给需要Cat类型的库函数,这样当它们调用Cat->Leap(),它们使用重写的虚函数,Lion->Leap()。这有可能吗?到目前为止,我尝试过的所有操作都以忽略覆盖函数而告终。我猜这是因为当库被编译时,它会计算出如何解析对Leap()的调用,此时我的派生类型不存在。或者,因为库引用了Cat类型的对象(实际上是Lion类型的对象),所以它调用Cat::Leap(),而不是Lion::Leap()。我原以为函数是虚拟的这一事实意味着,即使它

c++ - 阻止编译器优化的多态性示例?

不记得我现在在哪里看到它-但我在某处读到动态多态性阻止编译器进行各种优化。除了内联之外,有人可以用多态性阻止编译器进行的此类“错过”优化机会的任何示例来启发我吗? 最佳答案 与:Derivedd;d.vMethod();//thatwillcallDerived::vMethodstatically(allowinginlining).使用(除非Derived或Derived::vMethod之一在C++11中被声明为final):voidfoo(Derived&d){d.vMethod();//thiswillcallvirtua

c++ - 静态鸭子打字与 CRTP

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion这是来自StaticpolymorphisminC++的后续问题什么时候我应该更喜欢鸭子打字?什么时候我应该更喜欢CRTP?有什么最佳实践吗?归结为:templatevoidprint_renderer(constrenderer&r){r.get();}对比templatevoidprint_renderer(constT&r){static_assert(is_renderer,"No

c++ - 避免多态类中的虚表

根据thispage,Microsoft的扩展属性__declspec(novtable)“阻止编译器生成代码来初始化类的构造函数和析构函数中的vfptr……使用这种形式的__declspec可以显着减少代码大小。”我使用VisualStudio2013update4、发布配置、x64编译了以下代码,并获得了后面显示的汇编代码。struct__declspec(novtable)textEmpty{virtualvoidfs()=0;};structtextEmpty2{virtualvoidfs()=0;};structY:textEmpty{voidfs()override;};v