2014-09-23 34 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