2013-10-02 2 views
1

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

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() каждый раз, когда он не переопределяется. Правильно ли это?

Спасибо!

+1

'Deri2' не наследуется от' Base'. Это намеренно? – RedX

+0

Упс! Сожалею! Я исправил это сейчас. – Plamen

+1

Вам даже не нужно указывать директиву использования в этом случае. Только если вы перегружаете функцию, в дополнение к тому, что вы не хотите ее переопределять. – StoryTeller

ответ

0

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

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