簡體   English   中英

C ++多態模板類:調用基類方法而不是派生類

[英]C++ Polymorphism template class : calling base class method instead of derived class

我不知道為什么C ++編譯器運行基類方法( Sorting類的排序方法)而不是派生類方法( SelectionSort類的排序方法)。

template <typename T>
class Sorting {
public:
    virtual void sort(T* data, int size, Comparator<T> comparator) const {
    };
};

template <typename T>
class SelectionSort : public Sorting<T> {
public:
    void sort(T* data, int size, Comparator<T> comparator) {
        // my selection sort code
    };
};

template <typename T>
void Array<T>::sort(Sorting<T> algorithm, Comparator<T> comparator) {
    algorithm.sort(data, size, comparator); /// Problem is here !
};

int main() {
    int nums[] = { 2, 1, 3 };
    Array<int> arr(nums, 3);
    SelectionSort<int> sorting = SelectionSort<int>();
    AscendingComparator<int> comparator = AscendingComparator<int>();
    arr.sort(sorting, comparator);
    return 0;
}

您的特定問題是對象切片 您看起來就像來自Java,這在Java中就可以工作-但是在C ++中,復制對象時會丟失該對象的所有重要部分。 您需要做的是通過引用獲取接口:

template <typename T>
void Array<T>::sort(Sorting<T>& algorithm, Comparator<T>& comparator) {
                              ^                         ^
    algorithm.sort(data, size, comparator);
};

同樣在Sorting::sort() -需要通過引用獲取Comparator 請注意,您是否進行了Sorting和抽象基類,即具有:

template <typename T>
class Sorting {
public:
    virtual void sort(T* , int , Comparator<T> ) const = 0;
    //                                                ^^^^
};

編譯器將為您捕獲此錯誤,因為您無法創建您的代碼將需要的Sorting<T>類型的對象。

還要注意,正如Angew指出的那樣,您的SelectionSort類實際上沒有覆蓋Sorting<T>::sort因為它缺少const修飾符。 如果sort()在基類中是純虛擬的,則編譯器也會向您指出此錯誤。

您的代碼中還有其他一些Java內容:

SelectionSort<int> sorting = SelectionSort<int>();
AscendingComparator<int> comparator = AscendingComparator<int>();

應該只是:

SelectionSort<int> sorting;
AscendingComparator<int> comparator;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM