У меня есть родительский класс «base» и другой класс «производный», который наследуется от «base».
«производная» имеет 1 метод cH1.
если я сделаю это:
base* b = new derived();
И я хочу быть в состоянии сделать это:
b->cH1();
Очевидно, я не могу, и есть 2 решения:
или сделайте это:
dynamic_cast<derived*>(b)->cH1();
Какой из них лучше?
Если cH1
метод семантически относится к base
затем сделайте это base
метод.
Остальное, уходи cH1
в derived
и использовать dynamic_cast
,
я думаю семантика из ваших классов должны вести ваш выбор.
Например, если у вас есть базовый класс Vehicle
и производные классы Car
, Motorbike
, а также Aircraft
такой метод, как TakeOff()
имеет семантику, совместимую с Aircraft
но не с Car
или же Motorbike
так что вы можете сделать TakeOff()
Aircraft
метод, а не Vehicle
метод.
Во-первых, чтобы использовать dynamic_cast
, base
должен иметь хотя бы одну виртуальную функцию.
Во-вторых, использование dynamic_cast
является обычно признак ошибки дизайна. Если derived
действительно дитя base
, затем derived
объект должен быть в состоянии стоять там, где base
объект ожидается, и это обычно означает, что base
имеет виртуальные функции, чисто виртуальные или нет, и что derived
переопределяет некоторые или все из них.
Не зная что cH1
однако, порекомендовать подход невозможно.
dynamic_cast
чище и гибче, но немного медленнее.
Помните, когда вы используете dynamic_cast
проверить возвращенный указатель на NULL.