草庐IT

polymorphism

全部标签

c++ - 关于c++虚函数的问题

我是C++初学者,最近在研究虚函数。有些问题让我很困惑。例如:classA{public:virtualvoidf(){//dosomething;}}classB:publicA{public:virtualvoidf(){//dosomething;}}classA包含一个虚函数f(),和classB继承它。里面classB,函数f()也被声明为虚拟的,所以这是否意味着f()在classB重载f()在classA?它是否允许继承B的类重载f()?或者B定义一个不同于f()的新虚函数在classA?虚函数提供了一种重载方法的方法。如果B继承A并且不声明f()作为virtual,然后可

C++ 如何在 shared_ptr vector 中存储多种类型?

如何在std::vector中存储多个shared_ptr,每个shared_ptr都带有指向不同类型的指针?std::vectorvec;vec.push_back(make_shared(3));vec.push_back(make_shared(3.14f));是否有一个基本的多态类,我可以将其用于该任务而无需使用特定于编译器的东西? 最佳答案 有几种方法可以做到这一点。我假设您想存储各种native类型,因为您正在使用int和float。如果您的类型列表是有限的,请使用boost::variant.例如std::vector

c++ - 如何实现具有不同数据类型作为值的 map ?

我想将两种(不是更多)不同的数据类型作为值放入映射中,如下例所示:typeXA,B,...;typeYZ,Y,...;voidfunc(typeX){...}voidfunc(typeY){...}std::mapmap;map["a"]=A;map["z"]=Z;...std::vectorlist;//Thislistwillbesomethinglike"a","y",...for(unsignedinti=0;i显然这是行不通的,因为map只接受一种数据类型的值。但是,当遍历list时,对func()的调用应该是明确的,因为map[list[i]]的类型是已知的.我想避免显式转

C++ 零规则 : polymorphic deletion and unique_ptr behavior

在最近overloadjournal在执行零规则主题下,作者描述了我们如何避免编写五个运算符的规则,因为编写它们的原因是:资源管理多态性缺失这两个都可以通过使用智能指针来解决。这里我特别感兴趣的是第二部分。考虑以下代码片段:classBase{public:virtualvoidFun()=0;};classDerived:publicBase{public:~Derived(){coutpB=make_shared();pB->Fun();}在这种情况下,正如文章作者所解释的那样,我们通过使用共享指针进行多态删除,这确实有效。但是如果我将shared_ptr替换为unique_ptr

c++ - 多态值得增加耦合吗?

我正在编写一个简单的游戏来学习更多的C++经验,我有一个想法,我觉得多态性几乎有效,但没有。在这个游戏中,Party通过Map相当线性地移动,但偶尔会遇到Fork在路上。fork(基本上)是一个std::vector.最初我打算将类似以下内容的代码写入aParty成员函数:if(!CurrLocation->fork_.empty())//Loopthroughforksandshowoptionstotheplayer,gowheres/hewantselse(CurrLocation++)但我想知道以下的某些变体是否会更好:CurrLocation=CurrLocation->ge

c++ - 在不修改原有类的情况下添加虚函数

假设我们已经有了类的层次结构,例如classShape{virtualvoidget_area()=0;};classSquare:Shape{...};classCircle:Shape{...};etc.现在假设我想(有效地)向Shape添加一个virtualdraw()=0方法,并在每个子类中使用适当的定义。但是,假设我想在不修改这些类的情况下执行此操作(因为它们是我不想更改的库的一部分)。解决此问题的最佳方法是什么?我是否真的“添加”了一个virtual方法并不重要,我只想要给定一个指针数组的多态行为。我的第一个想法是这样做:classIDrawable{virtualvoid

c++ - 当我知道类型时,如何避免虚拟调用?

考虑以下代码片段:structBase{virtualvoidfunc(){}};structDerived1:Base{voidfunc()override{print("1");}};structDerived2:Base{voidfunc()override{print("2");}};classManager{std::vector>items;public:templatevoidadd(){items.emplace_back(newT);}voidfuncAll(){for(auto&i:items)i->func();}};intmain(){Managerm;m.ad

c++ - C++ 中 (base->*&Func)() 的含义是什么

下面是简单的类定义classBase{public:virtualvoidFunc(){cout和声明(b->*&Base::Func)();调用Func的派生版本,与b->Base::Func()不同,它按预期调用基础版本,为什么会发生这种情况,调用的确切含义是什么? 最佳答案 调用的意思是增加冗长。基本上:表达式&Base::Func是指向成员函数的指针,并且(b->*x)()是调用成员函数的语法x指向b指向的对象。在这个情况下,因为x是一个常量,所以它与写作大致相同*&变量。与b->Func()含义相同。至于为什么它的行为不同

c++ - 为什么我无法在 for 循环中访问动态分配的内存?

我为从基类instrument继承的子类类型stock新建了一个内存,当我尝试访问我的数组的第二个元素时,它抛出错误。当我的新数组大小为1时一切正常#include#include#includeusingnamespacestd;classInstrument{public:virtualvoiddisplay(){}virtualvoidoutput(){}virtualvoidreadFile(){}virtual~Instrument(){}};classStock:publicInstrument{public:Stock(){}virtualvoidinput(){cout

c++ - 使用 C++ 模板实现 Haskell 的 `map` 函数的问题

我喜欢使用Haskell,但不得不使用C++来完成学校作业。我正在为C++编写自己的库,它模拟Haskell的Prelude函数,因此如果我愿意,我可以用C++编写更简洁、更实用的风格(repoonGitHub)。我遇到的一个问题是实现类似map的功能对列表进行操作。在Haskell中,String相当于[Char],因此您可以在采用列表的函数中使用字符串。在C++中,std::string不与std::vector是一回事,所以我必须编写多个版本的函数来取std::string或std::vector.这适用于像filter这样的功能或tail因为它们的输入和输出是同一类型。但是用m