gpt4 book ai didi

c++ - 纯虚函数问题

转载 作者:行者123 更新时间:2023-12-01 13:40:38 28 4
gpt4 key购买 nike

我有一个基类,其中我有一个纯虚函数,并且使用这个函数,我想在其他派生类中覆盖它(如果可能的话,在一些具有不同数量参数的类中)。
所以在 MergeSort 子类中,我有 MSort 方法,它需要不同数量的参数,因为它是递归完成的。
因此,目前使用这些参数具有此功能,我收到此错误
'MergeSort:' 无法实例化抽象类。但是如果我从基类覆盖 Sort 方法可以正常工作,但我不需要一个参数。
我还尝试用不同数量的参数声明另一个虚函数并在 MergeSort 类中定义它,我得到了同样的结果。
我还想澄清一下,我还有其他用于不同算法(冒泡排序、插入排序等)的子类,它们的实现类似于 MergeSort(构造函数和排序函数),但排序函数的参数数量相同(只有一个用于图形界面),就像上面的基类一样。
那么是否有可能有一个具有不同数量参数的覆盖方法?或者我上面所说的任何其他解决方案?

// BASE CLASS
// Forward declaration
class Interface;

/**
* Base class from which the sorting algorithms classes will inherit (Polymorphic class)
* The base class will allow us to create a sequence with n elements
*/
class SortingAlgorithms
{

protected:
std::vector<sf::RectangleShape> sequence; // vector which will contain a randomized sequence
std::vector<sf::RectangleShape> sequenceCpy; // a copy of sequence used for interaction features
sf::RenderWindow& window; // initializes the window
int minimum, maximum; // the range in which the elements will be randomized
int elements; // the number of elements which will be initialized

public:
SortingAlgorithms();

/** SortingAlgorithms() - class constructor which initializes the sequence
* @param min - the minimum value for randomizing
* @param max - the maximum value for randomizing
* @param els - the number of elements to generate
* @param win - since the window will be initialized only once (singleton pattern);
* it will be needed to pass on this object to almost every function that has
graphics features
*/
SortingAlgorithms(int min, int max, int els, sf::RenderWindow& win);


// A pure virtual function for overriding and param init which is what I described about win param from SortingAlgorithms constructor
virtual void Sort(std::unique_ptr<Interface>& init) = 0;
};



class MergeSort : public SortingAlgorithms
{
public:
MergeSort(int min, int max, int els, sf::RenderWindow& win);

void Merge(std::unique_ptr<Interface>& init, int first, int mid, int last);
void MSort(std::unique_ptr<Interface>& init, int first, int last);
};

最佳答案

如评论中所述,您必须对所有覆盖使用相同的签名。在这样做时,您可以使用以下方法:
使用重写的函数作为一种入口点,在其中你调用一个真正的函数(可能是私有(private)的)来执行排序。举例说明该方法:

class SortingAlgo
{
public:
virtual void sort(int arr[], int n) = 0;
};

class BubbleSort: public SortingAlgo
{
public:
void sort(int arr[], int n){
this->bubble_sort(arr, n);
}
private:
void bubble_sort(int arr[], int n){
//implemetation
}
};

class MergeSort: public SortingAlgo
{
public:
void sort(int arr[], int n){
this->mergeSort(arr, 0, n - 1);
}
private:
void mergeSort(int arr[], int l, int r){
//recursive implemetation
}
void merge(int arr[], int l, int m, int r){
//implemenation
}
};

关于c++ - 纯虚函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63565855/

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