【问题标题】:Overrided method calling from base class c++从基类 C++ 调用重写的方法
【发布时间】:2021-12-26 12:50:26
【问题描述】:

我有 2 个类,分别是 NumberArray 和 PrimeNumberArray。 PrimeNumberArray 是 NumberArray 的子类 这些类具有生成随机数数组的方法。我在 NumberArray 类中调用这些方法。在主要方法中,我创建 PrimeNumberArray 对象并调用方法“generateAndPrint”,该方法应该调用 PrimeNumberClass 的生成方法,但实际上该方法是从基类工作的。找到素数的生成方法正在工作。我只是想学习如何在基类的方法中调用它。

基类;

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 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++;
            }
        }
    }
};

测试类;

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

我尝试将 generate 方法设为虚拟,但对我不起作用。

【问题讨论】:

  • “我试图将 generate 方法设为虚拟但对我不起作用。”:为什么它不起作用?您应该在基类的generate 上添加virtual。在派生类中是可选的。
  • @user17732522 谢谢,我只是尝试将子类中的方法设为虚拟。

标签: c++ inheritance overriding encapsulation


【解决方案1】:

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

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

[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();
}

【讨论】:

  • 谢谢,它解决了我的问题。而且我的数组指针无法正常工作。这段代码也解决了它。感谢您的帮助。
猜你喜欢
  • 2011-01-18
  • 2012-12-12
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 2023-03-12
  • 2013-05-06
  • 2016-10-05
相关资源
最近更新 更多