Нужно ли указывать виртуальные методы для подклассов? - PullRequest
25 голосов
/ 02 июля 2010

Возможно, это уже задавалось ранее в 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 для деструктора / метода подкласса?

Спасибо.

Ответы [ 3 ]

32 голосов
/ 02 июля 2010

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

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

8 голосов
/ 02 июля 2010

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

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

6 голосов
/ 02 июля 2010

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

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

...