require(dplyr)
df %>%
group_by(FlightID) %>%
arrange(FareClassRank) %>%
mutate(ratio=FareValue/lead(FareValue))
Нет, технически вам не нужно указывать virtual
. Если базовый метод является виртуальным, то C ++ автоматически сделает соответствующий метод переопределения virtual
.
Однако вы должны пометить их virtual
. В конце концов, этот метод virtual
, и он делает ваш код намного понятнее и проще для других разработчиков.
Вам это не нужно , но пометка этого может сделать ваш код более понятным.
Примечание: если в вашем базовом классе есть виртуальный деструктор, то ваш деструктор автоматически становится виртуальным. Вам может понадобиться явный деструктор по другим причинам, но нет необходимости переопределять деструктор, просто чтобы убедиться, что он виртуальный. Независимо от того, объявляете ли вы это с помощью виртуального ключевого слова, объявляете ли вы его без виртуального ключевого слова или не объявляете его вообще, оно все равно является виртуальным.
Виртуальное автоматически выбирается при переопределении производного метода независимо от того, указан ли он в дочернем классе.
Основным следствием является то, что без указания виртуального в дочернем элементе сложнее понять из определения дочернего класса, что этот метод фактически является виртуальным. По этой причине я всегда указываю виртуальный в родительских и дочерних классах.