从基类 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++ 调用重写的方法的主要内容,如果未能解决你的问题,请参考以下文章