从基类 C++ 调用重写的方法

Posted

技术标签:

【中文标题】从基类 C++ 调用重写的方法【英文标题】:Overrided method calling from base class 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 谢谢,我只是尝试将子类中的方法设为虚拟。 【参考方案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) : amountsize, 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> primestd::make_unique<PrimeNumberArray>(5);
   prime->generateAndPrint();

【讨论】:

谢谢,它解决了我的问题。而且我的数组指针无法正常工作。这段代码也解决了它。感谢您的帮助。

以上是关于从基类 C++ 调用重写的方法的主要内容,如果未能解决你的问题,请参考以下文章

访问从基类构造函数调用的重写方法中的私有方法

强制方法从基类调用子类新方法

C++编程中 子类(派生类)能不能重写父类(基类)的函数(方法),除了虚函数?

重写(override)与重载(overload)的区别

03_8_重写

如何将基类的未知子类放在一个数据结构中并在 C++ 中调用重写的基类函数