динамическое приведение — dynamic_cast против предоставления виртуальных функций в родительском классе (C ++)

У меня есть родительский класс «base» и другой класс «производный», который наследуется от «base».

«производная» имеет 1 метод cH1.

если я сделаю это:

base* b = new derived();

И я хочу быть в состоянии сделать это:

b->cH1();

Очевидно, я не могу, и есть 2 решения:

  • Либо объявите cH1 как чисто виртуальную базу.
  • или сделайте это:

    dynamic_cast<derived*>(b)->cH1();
    

Какой из них лучше?

3

Решение

Если cH1 метод семантически относится к baseзатем сделайте это baseметод.
Остальное, уходи cH1 в derivedи использовать dynamic_cast,
я думаю семантика из ваших классов должны вести ваш выбор.

Например, если у вас есть базовый класс Vehicle и производные классы Car, Motorbike, а также Aircraftтакой метод, как TakeOff() имеет семантику, совместимую с Aircraft но не с Car или же Motorbikeтак что вы можете сделать TakeOff() Aircraft метод, а не Vehicle метод.

7

Другие решения

Во-первых, чтобы использовать dynamic_cast, base должен иметь хотя бы одну виртуальную функцию.

Во-вторых, использование dynamic_cast является обычно признак ошибки дизайна. Если derived действительно дитя base, затем derived объект должен быть в состоянии стоять там, где base объект ожидается, и это обычно означает, что base имеет виртуальные функции, чисто виртуальные или нет, и что derived переопределяет некоторые или все из них.

Не зная что cH1 однако, порекомендовать подход невозможно.

3

dynamic_cast чище и гибче, но немного медленнее.

Помните, когда вы используете dynamic_cast проверить возвращенный указатель на NULL.

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector