我有 2 個類,分別是 NumberArray 和 PrimeNumberArray。PrimeNumberArray 是 NumberArray 的子類 這些類具有生成帶有亂數的陣列的生成方法。我在 NumberArray 類中呼叫這些方法。在 main 方法中,我創建 PrimeNumberArray 物件并呼叫方法“generateAndPrint”,該方法應該呼叫 PrimeNumberClass 的 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 方法成為虛擬的,但對我不起作用。
uj5u.com熱心網友回復:
下面的代碼應該讓你開始:
- 請
generatevirtual 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 << "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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/394022.html
