具有引用数据类型的函数多态性



我有一个包含Event类对象的队列。

std::priority_queue<Event> events;

但Event只是实际事件的一个超类。假设我们有以下类:

class Event{
   public:
     void Action(){
       std::cout<<"do nothing"<<std::endl;
     }
};
class XEvent : public Event{
   public:
     void Action(){ 
           std::cout<<"do x"<<std::endl;
     }
class YEvent : public Event{
   public:
     void Action(){
            std::cout<<"do y"<<std::endl;
     }
};

和在主要功能:

int main(){
  std::vector<Event> events;
  events.push_back(XEvent x);
  events.push_back(YEvent y);
  Event e = events[0];
  e.Action();
}

我希望e.操作按照被覆盖的版本执行。(即"do x")。

但输出却让我"什么都不做"。有什么建议吗?

p.s.实际上,我正在寻找一种不使用指针的方法

插入到向量中会复制元素。目标类型始终是Event,作为模板的参数给定,因此这将更改类型。

建议:

  • 请改用std::function。这些可能正是您正在搜索以处理事件的东西
  • 请改用(智能)指针类型,这样就可以存储多态元素
  • 请改用智能并集/变体类型,例如Boost.Any或Boost.variant(不确定它们中的任何一个现在是否已标准化)
class Event{
   public:
     virtual void Action(){
       std::cout<<"do nothing"<<std::endl;
     }
};

使用如上所述的虚拟函数,但您创建了一个对象,该对象可能来自类Event,您应该创建一个指针;

int main(){
  std::vector<Event> events;
  events.push_back(XEvent x);
  events.push_back(YEvent y);
  XEvent xe = events[0];
  Event* e = &xe;
  e->Action();
}

或者实现强制对象转换。

使用智能指针共享指针,尝试休耕代码:

#include<iostream>
#include<vector>
#include <memory>
class Event{
   public:
     virtual void Action(){
       std::cout<<"do nothing"<<std::endl;
     }
};
class XEvent : public Event{
   public:
     void Action(){ 
           std::cout<<"do x"<<std::endl;
     }
};
class YEvent : public Event{
   public:
     void Action(){
            std::cout<<"do y"<<std::endl;
     }
};
int main(){
  std::vector<std::shared_ptr<Event>> events;
  events.push_back(std::make_shared<XEvent>());
  events.push_back(std::make_shared<YEvent>());
  std::shared_ptr<Event> e = events[0];
  e->Action();
  return 0;
}

最新更新