Доступ к производному классу из указателя базового класса с фиксированным размером массива - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь написать функцию parkVehicle (), эта функция должна получить доступ к функции чтения члена производного класса через указатель базового класса. Как я могу получить к нему доступ?

class Parking {
     const int MAX_SPOTS_NO = 100;
    Base B[MAX_SPOTS_NO];
    void parkVehicle() const;

}


class Base : public Read {
    std::istream& read(std::istream& istr = std::cin);
}

class derived : public Base {
    std::istream& read(std::istream& istr = std::cin);
}


class Read{
virtual std::istream& read(std::istream& istr = std::cin) = 0; 
}



void parkVehicle() {
    //call read from the derived class
}

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

Ваш массив разрезает объекты , поэтому в массиве нет derived объектов, только Base объектов. Полиморфизм работает только при доступе к объектам через указатель или ссылку, поэтому вам нужно изменить массив, чтобы он содержал Base* указатели:

class Parking {
    static const int MAX_SPOTS_NO = 100;
    Base* B[MAX_SPOTS_NO];
    void parkVehicle() const;
};

void parkVehicle() {
    //call read from the derived class
    ...
    B[index]->read();
    ...
}

Затем вы можете хранить derived объекты в массиве по мере необходимости, например, 1 :

derived *d = new derived;
B[index] = d;

Или:

derived d;
B[index] = &d;

1: вы не предоставили достаточно кода, чтобы точно показать, КАК вам лучше всего создавать, управлять и хранить derived объектов.

0 голосов
/ 11 апреля 2020

Как предлагается в комментариях, ваш дизайн класса должен быть пересмотрен. Однако, просто для ответа на ваши запросы, вы можете изменить это так - переменная MAX_SPOTS_NO должна быть объявлена ​​как stati c, а переменная-член B может быть объявлена ​​как массив указателей (вместо этого следует использовать интеллектуальные указатели), чтобы избежать cycli c проблема резервирования

class Base; // forward declaration

class Parking {
public:
    static const int MAX_SPOTS_NO = 100;
    Base* B[MAX_SPOTS_NO];
    void parkVehicle() ;

};

void Parking::parkVehicle() {
    //call read from the derived class
    B[0] = new Base();
    B[0]->read();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...