- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
简短描述:
我正在迭代一个 vector ,在 vector 中的每个对象上调用一个虚函数,以执行一系列操作。 vector 和迭代器一样属于基类。所有的对象都是 child 。当调用虚函数时,它会执行基类的函数。
(真的)长描述:我正在尝试为具有一组行为的生物建模。我的基类是抽象的,只有两个函数(虚拟),所有子类都已覆盖:
class Behavior
{
public:
Behavior();
~Behavior(void){}
virtual void execute(){}
virtual BEHAVIOR_TYPE getType() {return m_Type;}
protected:
BEHAVIOR_TYPE m_Type;
};
我创建了一些子行为,比如移动、消耗、侦察等。
class Move :
public Behavior
{
public:
BEHAVIOR_TYPE getType() {return m_Type;}
enum Direction {N, NE, E, SE, S, SW, W, NW};
Move(DOCO * d);
~Move(void);
void execute() ;
Direction chooseDirection();
void setDirection(Direction newDirection);
private:
Direction m_Direction;
DOCO *I;
BEHAVIOR_TYPE m_Type;
};
我创建了一个 vector ,将每个 Behavior 子类的实例以及遍历它的迭代器推送到该 vector 上:
vector<Behavior> m_Behavior;
vector<Behavior>::iterator bIt;
当生物获得一个 Action 序列时,我尝试遍历 vector ,取消引用迭代器,并调用执行函数:
void World::justDoIt()
{
for(dIt=myDOCO.begin(); dIt!=myDOCO.end(); ++dIt)
{
vector<Behavior>::iterator myBehavior=(dIt)->getFirstBehavior();
vector<Behavior>::iterator end=(dIt)->getLastBehavior();
for(myBehavior; myBehavior!=end; ++myBehavior)
(*myBehavior).execute();
}
}
问题在于它执行父函数而不是子函数。
在我对后期绑定(bind)的理解中,它应该根据调用它的对象类型而不是调用它的指针类型自动调用适当的函数,并且在我的代码中我预计它会指向子对象。
显然我犯了一个错误,并以某种方式告诉程序我希望将它们视为 parent 而不是 child ,但我找不到我的错误。
第二个症状是它不会让我让父函数成为纯虚拟的,因为它说它不能实例化一个抽象类。我没有在我的代码中的任何地方显式地实例化它,但我肯定在某个地方隐式地做了它。但是,我找不到位置。当然创建一个 vector 来保存父类的对象不需要实例化父类,那是我唯一一次直接引用父类。
如有任何帮助,我们将不胜感激。
最佳答案
类(class)vector<Behavior>
使用复制构造函数复制您存储在其中的任何内容 Behavior::Behavior(const Behavior&);
.这破坏了多态性。您需要在容器中改用指针或智能指针:
vector<Behavior*> m_Behavior; // I will take care of new and delete
vector<shared_ptr<Behavior> > m_Behavior; // easier
如果你没有 std::shared_ptr
或 std::tr1::shared_ptr
在 #include <memory>
或类似的,也许你可以使用 Boost 的。
关于c++ - 虚拟功能 : Iterating over a vector<Base Class> that is populated with subclass objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200663/
我想知道在从另一个扩展的类中创建对象的这两种方法之间是否存在任何功能差异。 我只是在处理基本的继承,除了 Cat extends Mammal 之类的东西之外没有什么复杂的。 最佳答案 ParentC
class superClass {} class subClass extends superClass{} public class test { public static void m
我有一个跨很多很多项目的 C# 解决方案。我创建了一个从 Systme.Diagnostics.Tracing.EventSource 继承的跟踪类,称为 MyCustomEventSource,它处
考虑以下示例,其中 Student 继承自 Person: function Person(name) { this.name = name; } Person.prototype.say =
基本上是标题所说的内容,但有一些详细说明。我有一个带有几个子类的父类(super class)。我需要一个 ArrayList 来保存两种类型的子类,因此需要 SuperClass 类型的 Array
我正在阅读 mughal 的 SCJP(第 3 版)(我遇到的最好的 SCJP 书),在第 727 页上,它说了以下内容: class MyIntList extends ArrayList {}
我使用方法 Object process( JobContext jobContext ); 以及名为 JobProcessImpl 的 impl 来定义 JobProcess。每当执行此 JobPr
如果我想编写一个采用可变数量“TDerived”的方法,其中 TDerived 是类“Base”的任何子类,有什么办法可以做到这一点吗? 以下代码仅适用于单个特定的指定子类: void doStuff
有没有人(本地)弄清楚如何对 SKNode 进行子类化以包含通过关节连接的多个物体 - 例如汽车? 似乎没有办法将子类的关节添加到父场景的物理世界属性中。 此外,当尝试编译并运行下面的对象时,即使没有
我正在尝试编写 Node 库的扩展。该库导出一个扩展 EventEmitter 的类(class LibClass extends EventEmitter)。它负责建立一个 websocket 连接
Tensorflow 有一些 docs用于子类化 (tf) Keras Model 和 Layer。 但是,尚不清楚使用哪个“模块”或“ block ”(例如,几个层的集合)。 由于从技术上讲它是几个
我正在尝试对 android.os.AsyncTask 类进行通用子类化。我基本上只想给它添加一个属性。问题是,我仍然希望能够将它用作匿名类。 import android.content.C
是否可以在 swift 中对通用结构进行子类化? 假设我们有一个结构: struct Foo {} 我想要“子类化”它以添加一些功能: struct Something {} struct Bar
class A: pass class B(A): pass ListOfA = List[A] list_of_a : ListOfA = [A(), A()] for e in [
我想通过打印选择器和参数来拦截发送到代理对象的消息。即使代理没有实现它们并且没有目标对象。请帮忙。我已经查看了几个选项和 Apple 文档,但他们假设您已经知道目标对象。我想干净地完成此操作,而不会出
我有一个使用核心数据并有两个目标的项目。这些目标有几个共享实体。目前,我正在维护两个具有重复实体的独立模型,在我看来,这效率不高。 有没有办法将共享数据模型作为具体目标中数据模型的父级? 最佳答案 我
我收到以下错误: Could not find matching constructor for: org.crawler.CrawlerUtils$fetch(org.series.crawler.
在 Knockout 中,我有一个 Setting 实体数组,它们可能具有不同的类型(即设置实体的“子类”)。这些类型是动态的,用户可以在 UI 中更改它们。根据设置实体的类型,它需要不同的对象属性,
我有一个ArrayClass并且mergeSortArray扩展了它。并且 mergeSortArray 包含一个 mergeSort() 方法。但是,由于我使用 super 从父类(super cl
我是 PyTorch 的新手,在使用不同的工具包一段时间后尝试它。 我想了解如何对自定义层和函数进行编程。作为一个简单的测试,我写了这个: class Testme(nn.Module):
我是一名优秀的程序员,十分优秀!