子类化QVector <t> </t>

时间:2014-09-23 12:53:57

标签: c++ visual-c++ c++11

这是我的问题:我想继承QVector,以便添加一些特定于我的上下文的功能。

天真的做法是:

class ClassVector : public QVector<Class> { ... }

但问题在于我需要在QVector上调用少数几个函数来返回新的QVector(或者自身):

ClassVector cv1, cv2;
auto sum = cv1 + cv2;

这是有效的但是 sum是QVector,因为operator +返回QVector。

是否有简单的方法让它以某种方式返回ClassVector?

在结果上调用reinterpret_cast不是我想要做的:/

如果它很重要,我只向ClassVector添加功能,没有数据成员。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果新的operator+将返回不同的类型,您当然可以重新实现它。

#include <QVector>
#include <iostream>

class ClassVector : public QVector<int>
{
public:
    typedef QVector<int> base_type;

    ClassVector operator+ (const ClassVector& other) const
    {
        ClassVector sum(*this);
        static_cast<base_type&>(sum) += other;
        return sum;
    }
};

int main()
{
    ClassVector cv1;
    cv1.append(1);
    cv1.append(2);
    cv1.append(3);
    ClassVector cv2;
    cv2.append(11);
    cv2.append(12);

    ClassVector sum = cv1 + cv2;

    for (auto&& v : sum)
        std::cout << v << std::endl;
}

另一种选择是为QVector<Class>ClassVector的转换提供隐式构造函数。像

这样的东西
class ClassVector : public QVector<int>
{
public:
    typedef QVector<int> base_type;

    ClassVector() {}

    // Allow to convert a QVector<int> into a ClassVector.
    ClassVector(const QVector<int>& other) : QVector<int>(other) {}

    // ... possibly other constructors + assignment operator
};

也适用于你的情况。

但是,如果你没有向ClassVector添加新状态,我也会使用免费功能。