我正在创建一个从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()
}
}
许多人提前感谢
- 三
答案 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
上的现有方法来实现此目的。