草庐IT

polymorphism

全部标签

c++ - AST 的树模式匹配。 C++ 中有什么干净的方法吗?

上下文:我需要为抽象语法树编写一些树匹配规则。我想要一种简洁的方式,例如,如果为数组访问提供了数字文字索引(而不是符号索引),则进行匹配。假设我有一个抽象类(即有一个纯虚函数),lvalue。lvalue仅被子类化为2个具体类,variable和array_element。为了以不同的方式处理这两种情况,我可以应用访问者模式(但我认为它在这里有点矫枉过正)或者使用丑陋的dynamic_cast。(我已经使用访问者模式来遍历我的AST和CFG)voidmain(){lvalue*lv=newvariable("foo");//...somehowdoatree-patternmatchi

C++基本多态性

classProduct{...}classPerishable:public:Product{public:intgetday();}intmain(){Product*temp;//duetosomecoding//tempcouldpointtoeitherPerishableobjectorProductobjectthatisdetermine//duringruntimecoutgetday();//isthereotherwaytoachievethistypecastingseemsdangerous此代码的问题在于,如果temp指向Product对象,temp->ge

c++ - 多层次抽象类

我写了下面的代码。#includeusingnamespacestd;classCI{public:virtualvoiddisplay()=0;};classInter:publicCI{public:intparseData(int);};Inter::parseData(intdata){coutdisplay();temp=obj->parseData(100);coutdisplay();temp=obj->parseData(200);}我的问题是:为什么我无法调用obj->parseData函数?。根据我的理解,因此类“Last”和“USB”派生自类“Inter”,它应该

c++ - 如何从基类转换为派生类?

我想制作一个多线程模型,其中服务器主循环不会因挂起的数据库事务而停止。所以我做了几个简单的类,这是一个非常简化的版本:enumType{QueryType_FindUser=1现在,当我将数据作为Base传输时,我想再次将其转换回User类:concurrency::concurrent_queueBackgroundQueryQueue;voidBackgroundQueryWorker::Worker(){while(ServerRunning){QueryInformation::BaseTemp;if(BackgroundQueryQueue.try_pop(Temp)){sw

c++ - boost::any 违反了 Liskov 替换原则

我发现不可能从boost::any中提取对基类型的引用它持有派生类型:boost::anyholder=Derived();constBase&base_ref=boost::any_cast(holder);抛出一个boost::bad_any_cast异常。这似乎违反了Liskovsubstitutionprinciple而且不是很方便。有任何解决方法吗? 最佳答案 我不认为它“违反”了它-boost::any并非专为您的使用而设计。它专门设计用于处理值类型(请参阅文档,您已经向其发布了链接)。您必须将any_cast准确转换为

c++ - C++ 中的多态返回类型

我看过一些关于这个问题的帖子,但没有总结出我目前情况下所有的选择,可能还有我没有考虑过的解决方案。我的情况很一般,我有几个类Inf1Inf2(更像是接口(interface))都有纯虚方法。Inf1有一个方法(Inf2&orInf2*orshared_pointer)foo(/**关于如何构建对象的一些信息**/)=0(这是问题的一部分)。在Inf1的实现中,在实现foo时返回Inf2的各种实现。Inf2实现相对较小,所以我不介意按值返回它们,因此它们是复制构造到结果的,但我不能声明foo只返回Inf2因为那时我会返回一个抽象对象。有什么更好的或有创意的方法来解决这个问题?:)

c++ - 允许运行时和编译时多态性的灵活方式?

示例情况:我正在创建一个用于游戏开发的物理引擎。我有两种空间划分方法:网格四叉树我想允许将要使用我的物理引擎的程序员:在编译时通过模板参数选择空间划分方法Physics::Worldworld;//chosenatcompile-time通过多态对象在运行时选择空间划分方法Physics::WorldRunTimeworld;world.setSpatialPartitioningMethod(newPhysics::Grid);//chosenatrun-time您可以从上面的示例中注意到,我必须使用两个不同的类(World和WorldRunTime)。这会导致代码重复,因为我将拥有

c++ - 在 C++ 中定义虚拟 get 和 set 函数被认为是一种好的做法吗?

如果我有一个简单的2级类层次结构,例如这个://level1classSpare_Part{private:stringname;doubleprice;public:Spare_Part();stringgetName(){returnname;}doublegetPrice(){returnprice;}virtualintgetQuantity(){return-1;};//mayalsodefineitaspurevirtual};//level2classOn_hand:publicSpare_Part{private:intquantity;stringlocation;p

c++ - 纯虚拟 friend 类

我有课A有一个指向纯虚类实例的指针B.类C源自B并且会自动有一个指向A的指针(它是它的父级),并且需要访问它的成员。这可以通过添加friendclassC来实现内部类A,虽然这对于将从B派生的每个类都是必需的.代码示例:classA{public:friendclassB;//ThisdoesnotallowderivedclassestobefriendsfriendclassC;//NowderivedclassBhasaccessto`DoDomething`,butthenthisisneededforeverysinglederivedclassprivate:voidDoD

c++ - 如何确保在 C++ 中覆盖(隐藏)派生类中的方法?

classBase{public:voidfoo()const{std::cout我想确保foo()const为Base正确隐藏。是的,这是个坏主意,也许我应该将Base::foo()const设为纯虚拟,以要求Dervied::foo()正确覆盖——但假设我无法将Base::foo()设为纯const虚拟的。有没有更好的方法来确保Base::foo()const正确隐藏在Derived中?编辑:我想确保在Derived中我已经正确地隐藏了基础实现。 最佳答案 只需在派生类中定义一个成员函数foo,您就隐藏了基类中的所有foo函数。