2014-09-23 97 views
2

这是我的问题:我想子类QVector为了添加一些特定于我的上下文的函数。QVector子类化<T>

幼稚的做法是:

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

但这里的问题是,当我需要调用上QVector其返回新QVector(或&自身)几个功能之一:

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

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

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

呼吁结果的reinterpret_cast是不是我想做的事:/

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

感谢您的帮助。

+4

我不知道QVector,但并不是所有的类都意味着被继承。你可以添加你的函数作为独立(或在命名空间)?特别是如果你只添加功能,并且它没有虚拟功能。 – 2014-09-23 12:57:44

+3

我建议不要继承'QVector'。你可以添加你的函数作为自由函数,因为你显然不需要为类添加状态?或者,你可以用'QVector'作为成员而不是超类来创建你的新类(这称为聚合)? – 2014-09-23 12:58:38

+0

是的,这就是我目前正在做的(命名空间中的免费函数),但是我很好奇,如果没有更聪明的方法来做这件事..看起来它不是:/ – Paladin 2014-09-23 13:11:43

回答

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,我还会使用免费功能。

+0

我也可以重写__non-virtual__函数吗? – Paladin 2014-09-23 14:25:16

+0

请注意,上面的示例中没有虚函数。只要你不通过基类指针(或引用)来操作,你也可以重载非虚函数。 – Mehrwolf 2014-09-23 16:01:23

+0

好的,感谢您的帮助:)我正在使用免费功能,它似乎更清洁(和更安全) – Paladin 2014-09-24 06:44:13