2011-06-11 7 views
4

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

class Interface 
{ 
    public: 
    virtual void foobar() = 0; 
}; 

class Concrete 
    : public Interface 
{ 
    public: 
    virtual void foobar(); 
}; 

ответ

13

Не имеет значения.

void foobar() в Concrete является virtual независимо объявить ли вы его в качестве такового, и он отменяет void foobar() в Interface.

+4

Я не знал, что виртуальные функции всегда остаются виртуальными. Сегодня я кое-что узнал о C++. : D –

+0

Не знал этого. Я думал, вы должны сказать, чтобы он оставался виртуальным. Как жаль, он может спасти компилятор от вызова виртуальной функции, если он знает, что у него есть объект «Concrete». –

+0

Если вы вызываете foobar() с помощью указателя интерфейса, тогда компилятор вынужден совершать вызов виртуальной функции, поскольку он не имеет способа узнать фактический тип объекта. Однако, если вы вызываете foobar() непосредственно на объект Concrete, компилятор может генерировать прямой вызов функции, а не проходить через vtable. – Ferruccio

7

Хотя это не имеет значения, если virtual присутствует ключевое слово в производном классе или нет, я нашел, что это непременная экономию времени самодокументированна практика всегда включить его, так что, кто работает с вашим кодом через два года сразу можно увидеть, что для класса есть нечто большее, чем то, что сразу встречает глаз.

+0

Я считаю, что это на самом деле одно из правил, которые вы можете [опционально] сообщить компилятору, чтобы обеспечить соблюдение в C++ 11, поэтому, если вы когда-нибудь забудете, ваш код не будет компилироваться. –

+0

@ Dennis: Думаю, вы думаете о ** Явных виртуальных переопределениях функций **: http://en.wikipedia.org/wiki/C%2B%2B0x#Explicit_virtual_function_overrides –

Смежные вопросы