假设我有一堆水果:classFruit{...};classApple:publicFruit{...};classOrange:publicFruit{...};以及一些对所述水果进行操作的多态函数:voidEat(Fruit*f,Pesticide*p){...}voidEat(Apple*f,Pesticide*p){ingest(f,p);}voidEat(Orange*f,Pesticide*p){peel(f,p);ingest(f,p);}好的,等等。停在那儿。请注意,任何理智的人都会将Eat()设为Fruit类的虚拟成员函数。但这不是一个选择,因为我不是一个理智的人
是否可以将STL容器从Base类型转换为Derived类型?例如,我有两个vector。第一个是基类类型,第二个是派生类类型。classBase{//Code};classDerive:publicBase{//Code};用法vector*vec_base=newvector;//AddsomeDerivetypedatatovec_basevector*vec_derive=(vector*)(vec_base);//UsingelementsasDerivepointers.Worksfine.这样可以吗?(它工作正常,但我想对此发表一些评论)。非常感谢你。编辑:根据答案更新。说
我必须实现基本相同的功能,但尺寸不同。具体来说,它类似于...type&operator=(unsignedint);type&operator=(unsignedlongint);type&operator=(unsignedlonglongint);type&operator=(int);type&operator=(longint);type&operator=(longlongint);type&operator=(shortint);//soonandsoforth...他们必须做完全相同的事情......(除了我应该考虑不同的大小),主要思想是“如果类型是最广泛的使用任务的
我知道虚函数本质上是包含在vtable中的函数指针,由于间接等原因,这会使多态调用变慢。但是我想知道调用是确定性的时编译器优化。我所说的确定性是指以下情况:该对象是一个值而不是一个引用,因此不可能存在多态性:structFoo{virtualvoidDoSomething(){....}};intmain(){Foomyfoo;myfoo.DoSemthing();return0;}引用的是一个没有child的类(class):structFoo{virtualvoidDoSomething();};structBar:publicFoo{virtualvoidDoSomething(
classBase{public:virtualvoidf();voidf(int);virtual~Base();};classDerived:publicBase{public:voidf();};intmain(){Derived*ptr=newDerived;ptr->f(1);deleteptr;return0;}ptr->f(1);显示以下错误:“函数调用中的参数过多”。为什么这是不可能的?derived不是继承了base的所有功能并且可以自由使用其中的任何功能吗?我可以明确地调用它并且它会起作用,但为什么不允许这样做? 最佳答案
作为初学者尝试多态性。我想我正在尝试不同语言的相同代码,但结果不一样:C++#includeusingnamespacestd;classA{public:voidwhereami(){coutwhereami();return0;}结果:You'reinAYou'reinBYou'reinAJava:publicclassBextendsA{voidwhereami(){System.out.println("You'reinB");}}//andsameforAwithoutextends//...publicstaticvoidmain(String[]args){Aa=newA
在Scala中,有一种设计模式通常被称为“pimpmylibrary”。基本思想是我们有一些类Foo(大概在一些我们不能修改的库中),我们希望Foo表现得像它有一些方法或行为frobnicate,我们可以使用隐式类在事后添加方法。implicitclassBar(valfoo:Foo)extendsAnyVal{deffrobnicate():Unit={//Somethingreallycoolhappenshere...}}然后,如果我们有一个Foo的实例,我们可以对其调用frobnicate,并且只要Bar在范围内,Scala编译器将足够聪明,可以将Foo隐式转换为Bar。val
我有一个棘手的情况。它的简化形式是这样的classInstruction{public:virtualvoidexecute(){}};classAdd:publicInstruction{private:inta;intb;intc;public:Add(intx,inty,intz){a=x;b=y;c=z;}voidexecute(){a=b+c;}};然后在一节课上我做了类似...voidsome_method(){vectorv;Instruction*i=newAdd(1,2,3)v.push_back(*i);}在另一个类(class)...voidsome_other_
我想创建一个名为“Node”的空基类,然后从中派生其他类,例如“DecisionNode”和“Leaf”。这样做很有意义,因此我可以利用多态性将这些不同类型的节点传递给方法,而无需在编译时知道将传递给方法的内容,但每个派生类都不共享任何状态或方法。我认为最好的实现方法是使构造函数成为纯虚拟的,而无需在基类中创建额外的纯虚拟方法(这会增加困惑)。因此,在该类的头文件“Node.h”中,我写道:classNode{private:virtualNode();};在“Node.cpp”中我写道:#include"Node.h"virtualNode::Node()=0;此实现防止Node被另
如何在C++中创建一个可以容纳不同类对象的数组? 最佳答案 您可以使用boost::any或boost::variant(两者之间的比较:[1])。或者,如果“不同类的对象”有共同的祖先(比如Base),您可以使用std::vector(或std::vector>),并将结果转换为Derived*当你需要的时候。 关于c++-在C++中创建一个可以保存不同类对象的数组,我们在StackOverflow上找到一个类似的问题: https://stackoverf