我有两个类,分别是NumberArray和PrimeNumberArray。PrimeNumberArray是NumberArray的子类。这些类具有生成随机数数组的生成方法。我在NumberArray类中调用这些方法。在main方法中,我创建PrimeNumberArray对象并调用方法";生成并打印"它应该调用PrimeNumberClass的generate方法,但实际上该方法是在基类中工作的。找到素数的Generate方法正在工作。我只想学习如何在基类的方法中调用它。
基类;
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
在基类中为virtual void generate()
,使virtual void generate() override
在派生类中为 - 创建
PrimeNumberArray
的堆实例,但将它们分配给NumberArray
指针;您可以为此使用智能指针,这样就不需要手动释放实例 - 然后,您可以使用指向基类的指针来调用任何
virtual
方法;运行时多态性将启动并最终调用派生类方法 - 只能在基类中进行
numbers
'管理;您不需要在派生类中重复代码;只需使用NumberArray(size)
从派生类构造函数中调用基类构造函数 - 在基类中也添加一个虚拟析构函数
【演示】
#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 << "an";
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();
}