C ++父类方法调用

时间:2009-10-14 17:57:12

标签: c++ inheritance

我正在创建一个从STL库继承队列的新类。该类的唯一补充是向量。此向量将具有相同的队列大小,并将存储一些与队列中的每个对象相对应的整数值。

现在,我想覆盖pop()和push(),但我只是想为父类的方法添加更多功能。

离。当在队列对象上调用pop()时,我还想从向量中弹出一个对象。当在队列对象上调用push()时,我还想在向量中插入一个新对象。

我该怎么做?

#include <iostream>
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

template <typename type>
class CPU_Q : public queue<type>
{

  public:
    vector<int>  CPU_TIME;

    void increaseTime()
    {
      for(int ndx = 0; ndx < CPU_TIME.size(); ndx++)
      {
        CPU_TIME[ndx]++;
      }
    }

  void push(type insertMe)
  {
    //This is what I want to do
    super::push(); // or queue::push(); maybe?
    CPU_TIME.push_back(0);
  }
  void pop()
  {
    //Something very similar to push()
  }
}

许多人提前感谢

- 三

4 个答案:

答案 0 :(得分:6)

你问过:

void push(type insertMe){
      //This is what I want to do
      super::push(); // or queue::push(); maybe?
      CPU_TIME.push_back(0);
}

那更像是:

void push(type insertMe) { 
   queue<type>::push(insertMe);
   CPU_TIME.push_back(0);
}

除非您可能希望通过const引用接受参数:

void push(type const &insertme) { 
    queue<type>::push(insertMe);
    CPU_TIME.push_back(0);
}

也就是说,标准的容器类并不是真正设计用于继承(例如它们没有虚拟存储器),所以你必须小心这一点 - 例如当你销毁它时,你需要静态类型作为派生类型;如果(例如)你通过指向基类的指针销毁一个行为,你将获得未定义的行为。

答案 1 :(得分:2)

STL队列类不打算使用继承进行扩展。查看here以获取更多相关信息。除此之外std::queue有多个模板参数。您可以使用std::queue作为模板类CPU_Q的成员,而不是继承,如下所示:

template<typename T>
class CPU_Q
{
  std::queue<T> q;
public:
  void push( T val ) 
  { 
    q.push( val );
    // additional work
  }
};

答案 2 :(得分:1)

简单的回答是,这是不可能的。 STL容器类不是为继承而设计的。他们的析构函数不是虚拟的。如果你真的想做这样的事情,那么写一个“包含”队列和向量的新类,并在任何地方使用这个类。顺便说一下,与Java不同,C ++中没有super关键字。如果要调用基类方法,请使用BaseClassName::methodName();

答案 3 :(得分:1)

除非您的新课程与std::queue之间存在 is-a 关系,否则我会强烈考虑封装队列和向量,并提供转发到相应std::queue的方法/ std::vector方法,按照您希望它们被调用的顺序。

此外,如果您希望此新类与标准算法兼容,则必须实现begin()end()方法,该方法返回能够处理数据的iterator类型结构体;您可以使用std::queue / std::vector上的现有方法来实现此目的。