从 base class c++ 调用的重写方法
Overrided method calling from base class c++
我有 2 个 classes 作为 NumberArray 和 PrimeNumberArray。 PrimeNumberArray 是 NumberArray 的子 class 这些 classes 具有生成随机数数组的生成方法。我在 NumberArray class 中调用这些方法。在主要方法中,我创建了 PrimeNumberArray 对象并调用方法“generateAndPrint”,该方法应该调用 PrimeNumberClass 的生成方法,但实际上该方法是从基础 class 开始工作的。生成查找素数的方法正在运行。我只想学习如何从基础 class.
的方法中调用它
基地class;
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;
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++;
}
}
}
};
测试class;
int main(){
PrimeNumberArray prime(5);
prime.generateAndPrint();
}
我尝试使生成方法成为虚拟方法,但对我不起作用。
下面的代码应该可以帮助您入门:
- 在基础 class 中生成
generate
virtual void generate()
,在派生 class 中生成 virtual void generate() override
。
- 创建
PrimeNumberArray
的堆实例,但将它们分配给 NumberArray
指针;您可以为此使用智能指针,因此您无需手动释放实例。
- 然后,您可以使用指向基 class 的指针调用任何
virtual
方法;运行时多态性将启动并最终调用派生的 class 方法。
- 只能在class基地进行
numbers
'管理;您不需要在派生 class 中复制代码;只需使用 NumberArray(size)
. 从派生的 class 构造函数调用基础 class 构造函数
- 在基类中也添加一个虚拟析构函数class。
#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();
}
我有 2 个 classes 作为 NumberArray 和 PrimeNumberArray。 PrimeNumberArray 是 NumberArray 的子 class 这些 classes 具有生成随机数数组的生成方法。我在 NumberArray class 中调用这些方法。在主要方法中,我创建了 PrimeNumberArray 对象并调用方法“generateAndPrint”,该方法应该调用 PrimeNumberClass 的生成方法,但实际上该方法是从基础 class 开始工作的。生成查找素数的方法正在运行。我只想学习如何从基础 class.
的方法中调用它基地class;
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;
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++;
}
}
}
};
测试class;
int main(){
PrimeNumberArray prime(5);
prime.generateAndPrint();
}
我尝试使生成方法成为虚拟方法,但对我不起作用。
下面的代码应该可以帮助您入门:
- 在基础 class 中生成
generate
virtual void generate()
,在派生 class 中生成virtual void generate() override
。 - 创建
PrimeNumberArray
的堆实例,但将它们分配给NumberArray
指针;您可以为此使用智能指针,因此您无需手动释放实例。 - 然后,您可以使用指向基 class 的指针调用任何
virtual
方法;运行时多态性将启动并最终调用派生的 class 方法。 - 只能在class基地进行
numbers
'管理;您不需要在派生 class 中复制代码;只需使用NumberArray(size)
. 从派生的 class 构造函数调用基础 class 构造函数
- 在基类中也添加一个虚拟析构函数class。
#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();
}