С++ избегает динамической отправки в производных классах с использованием ключевого слова

Буду ли я использовать динамическую диспетчеризацию для вызова виртуальных функций в следующем примере?

struct Base{
    virtual double fn(){return 3.2;}
};
struct Deri1 : public Base{
    using Base::fn;
}
struct Deri2 : public Base{
    virtual double fn(){return 4.6;}
}

Классы, которые я реализую, содержат гораздо больше информации, но есть некоторые, которые я хочу оставить по умолчанию для некоторых производных классов, но переопределить в других, например, fn() в приведенном выше коде. По сути, я просто использую базовый класс, чтобы не переписывать fn() каждый раз, когда он не переопределяется. Это правильный путь?

Спасибо!


person Plamen    schedule 02.10.2013    source источник
comment
Deri2 не наследуется от Base. Это намеренно?   -  person RedX    schedule 02.10.2013
comment
Ой! Извиняюсь! Я исправил это сейчас.   -  person Plamen    schedule 02.10.2013
comment
В этом случае вам даже не нужно ставить директиву using. Только если вы перегружаете функцию, помимо того, что не хотите ее переопределять.   -  person StoryTeller - Unslander Monica    schedule 02.10.2013
comment
Спасибо, но я стараюсь избегать динамической диспетчеризации, то есть использования виртуальных таблиц для определения виртуальной функции. Кроме того, в расширении происходит некоторая перегрузка.   -  person Plamen    schedule 02.10.2013
comment
Если вам не нужна динамическая диспетчеризация, просто не делайте функции virtual.   -  person Kerrek SB    schedule 02.10.2013
comment
@KerrekSB Но тогда я не смогу их переопределить, верно...?   -  person Plamen    schedule 02.10.2013
comment
@KarrekSB Хорошо, кажется, теперь я понял. Я могу просто перегрузить функцию «fn()» в «Deri2» и тем самым избежать ключевого слова «виртуальный». Зачем в таком случае использовать «виртуальный»?? Если это не чисто виртуальная функция, это не имеет никакого смысла. Один только теряет эффективность из-за поиска vtable.   -  person Plamen    schedule 02.10.2013
comment
Если вы не используете виртуальные функции, вам также не следует использовать открытое наследование.   -  person n. 1.8e9-where's-my-share m.    schedule 02.10.2013


Ответы (1)


Можно избежать динамической отправки, избегая ключевого слова «виртуальный» в определении функции, если не используются указатели, как описано в этом ссылка.

Это создает некоторые сложности с универсальными методами и полиморфизмом. Если кто-то использует динамический полиморфизм, он должен передать указатель на базовый класс методу, и в этом случае ключевое слово «виртуальный» необходимо для указателя, чтобы определить, какой метод использовать. Статический полиморфный метод можно определить с помощью шаблонов, как описано в следующей link. .

person Plamen    schedule 02.10.2013