gpt4 book ai didi

C++ 多态模板类 : calling base class method instead of derived class

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:45 24 4
gpt4 key购买 nike

我不知道为什么 C++ 编译器运行基类方法(sortSorting 方法)而不是派生类方法(sort> 类 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;
}

最佳答案

您的具体问题是 Object Slicing .您看起来像是来自 Java,这在 Java 中可以正常工作 - 但在 C++ 中,当您复制对象时,您会丢失对象的所有重要部分。您需要做的是通过引用获取您的接口(interface):

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;

关于C++ 多态模板类 : calling base class method instead of derived class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29497821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com