从基类c++调用的方法被重写



我有两个类,分别是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();
}

最新更新