Подтвердить что ты не робот

Нужно ли указывать виртуальные методы подклассов?

Это, вероятно, было задано ранее на SO, но мне не удалось найти аналогичный вопрос.

Рассмотрим следующую иерархию классов:

class BritneySpears
{
  public:

    virtual ~BritneySpears();
};

class Daughter1 : public BritneySpears
{
  public:

    virtual ~Daughter1(); // Virtual specifier
};

class Daughter2 : public BritneySpears
{
  public:

    ~Daughter2(); // No virtual specifier
};

Есть ли разница между классами Daughter1 и Daughter2?

Каковы последствия указания/не указания virtual на деструктор/метод подкласса?

Спасибо.

4b9b3361

Ответ 1

Нет, вам технически не нужно указывать virtual. Если базовый метод является виртуальным, то С++ автоматически сделает метод переопределения соответствия virtual.

Однако вы должны пометить их virtual. Метод virtual в конце концов, и он делает ваш код намного понятнее и проще для других разработчиков.

Ответ 2

Он вам не нужен, но его маркировка может сделать ваш код более понятным.

Примечание: если ваш базовый класс имеет виртуальный деструктор, тогда ваш деструктор автоматически виртуальный. Возможно, вам понадобится явный деструктор для других причин, но нет необходимости redeclare деструктор просто сделать уверен, что это виртуально. Независимо от того, вы объявляете его с помощью виртуального ключевое слово, объявите его без виртуальное ключевое слово или не объявлять его на самом деле, он все еще виртуальный.

Ответ 3

Виртуальный автоматически выбирается на переопределении производного метода, независимо от того, указывается ли он в дочернем классе.

Главное следствие заключается в том, что без указания виртуального в ребенке сложнее увидеть из определения дочернего класса, что метод фактически виртуальный. По этой причине я всегда указываю virtual как в родительском, так и в дочернем классах.