Как получить доступ к члену класса, когда он хранится как объект родительского класса, у которого нет такого метода? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть иерархия, такая как:

Element
|_Resitance
|_DC Voltage Source
|_AC Voltage Source
|_AC Current Source
|_DC Current Source
|_DynamicElement
|  |_Inductor
|  |_Capacitor
|_SwitchingDevices
|  |_Switch
|  |_Diode
.
.
.

Поскольку мой вход может быть любым списком из них, все они вставляются в std::vector<Element*>.Проблема в том, что источники Diode, Switch и Voltage имеют идентификационный элемент, к которому я должен получить доступ.

Я хочу иметь возможность запускать * (* Element) .ID или что-то подобное, когда я 'Я уверен, что Element является подклассом с таким членом.

Я действительно не хочу включать член ID в класс Element, потому что это случится много, и у класса будет многонеподходящего участника.

1 Ответ

0 голосов
/ 07 февраля 2019

Добавьте виртуальный деструктор в базовый класс и используйте dynamic_cast<> для производного класса для доступа к его членам.dynamic_cast по ссылке вызовет исключение, если объект не является экземпляром типа, к которому вы приводите, и dynamic_cast по указателю вернет nullptr в том же случае.

Пример:

class Element
{
    ...
    virtual ~Element() = default;
};

...

Element * el = new Diode();
Diode * d = dynamic_cast<Diode *>(el);
if (d) {
// ok, this is diode
}
...