从 base class c++ 调用的重写方法

Overrided method calling from base class c++

我有 2 个 classes 作为 NumberArray 和 PrimeNumberArray。 PrimeNumberArray 是 NumberArray 的子 class 这些 classes 具有生成随机数数组的生成方法。我在 NumberArray class 中调用这些方法。在主要方法中,我创建了 PrimeNumberArray 对象并调用方法“generateAndPrint”,该方法应该调用 PrimeNumberClass 的生成方法,但实际上该方法是从基础 class 开始工作的。生成查找素数的方法正在运行。我只想学习如何从基础 class.

的方法中调用它

基地class;

class NumberArray{
protected:
    int* numbers;
    int amount;
public:
    NumberArray(int size = 0){
        amount = size;
        int array[amount];
        numbers = array;
    }
    ~NumberArray(){
        delete[] numbers;
    }
    void generateAndPrint(){
        generate();
        print();
    }
private:
    void generate(){
        int i = 0;
        while (i < amount)
        {
            cout << "a" << endl;
            int rnd = (rand() % 1000) +1;
            numbers[i] = rnd;
            i++;
            
        }
    }
    void print(){
        int i;
        for (i = 0; i < amount; i++)
        {
            cout << numbers[i] << " -> ";
        }
        cout << endl;
    }
};

子class;

class PrimeNumberArray: public NumberArray{
public:
    PrimeNumberArray(int size){
        amount = size;
        int array[amount];
        numbers = array; 
    }

    void virtual generate(){
        int i = 0;
        while (i <amount)
        {                   
            int rnd = (rand() % 1000) +1;
            int j;
            int isPrime = 1;
            for(j = 2; j < rnd / 2; j++){
                if(rnd % j == 0){
                    isPrime = 0;
                }
            }
            if(isPrime == 1){
                numbers[i] = rnd;
                i++;
            }
        }
    }
};

测试class;

int main(){
   PrimeNumberArray prime(5);
   prime.generateAndPrint();
}

我尝试使生成方法成为虚拟方法,但对我不起作用。

下面的代码应该可以帮助您入门:

  • 在基础 class 中生成 generate virtual void generate(),在派生 class 中生成 virtual void generate() override
  • 创建 PrimeNumberArray 的堆实例,但将它们分配给 NumberArray 指针;您可以为此使用智能指针,因此您无需手动释放实例。
  • 然后,您可以使用指向基 class 的指针调用任何 virtual 方法;运行时多态性将启动并最终调用派生的 class 方法。
  • 只能在class基地进行numbers'管理;您不需要在派生 class 中复制代码;只需使用 NumberArray(size).
  • 从派生的 class 构造函数调用基础 class 构造函数
  • 在基类中也添加一个虚拟析构函数class。

[Demo]

#include <iostream>  // cout
#include <memory>  // make_unique, unique_ptr

class NumberArray {
protected:
    int* numbers;
    int amount;
public:
    NumberArray(int size = 0) : amount{size}, numbers{ new int[](size) } {}
    virtual ~NumberArray() { delete[] numbers; }    
    void generateAndPrint() {
        generate();
        print();
    }
private:
    virtual void generate() {
        for (int i = 0; i < amount; i++) {
            std::cout << "a\n";
            int rnd = (rand() % 1000) + 1;
            numbers[i] = rnd;
            i++;
        }
    }
    void print() {
        for (int i = 0; i < amount; i++) {
            std::cout << numbers[i] << " -> ";
        }
        std::cout << "\n";
    }
};

class PrimeNumberArray: public NumberArray {
public:
    PrimeNumberArray(int size) : NumberArray(size) {}

    virtual void generate() override {
        for (int i = 0; i < amount; ) {                   
            int rnd = (rand() % 1000) + 1;
            bool isPrime = true;
            for (int j = 2; j < rnd / 2; j++) {
                if (rnd % j == 0) {
                    isPrime = false;
                }
            }
            if (isPrime) {
                numbers[i] = rnd;
                i++;
            }
        }
    }
};

int main() {
   std::unique_ptr<NumberArray> prime{std::make_unique<PrimeNumberArray>(5)};
   prime->generateAndPrint();
}