Какова цель добавления определения для чисто виртуального деструктора? - PullRequest
3 голосов
/ 10 марта 2011

Вдохновлен: C ++ - почему мы должны определять чистый виртуальный деструктор вне определения класса?

Что на самом деле делает следующий код?

class Object
{
    public:
    virtual ~Object() = 0;
};

Object::~Object() { /*...*/ }
* 1007Я думал, что смысл чисто виртуальной функции заключается в том, чтобы заставить подклассы реализовать эту функцию.Если это так, то зачем использовать ту же функцию в виртуальном базовом классе?

Ответы [ 2 ]

10 голосов
/ 10 марта 2011

Этот код не позволяет вам создавать экземпляр Object, и в то же время позволяет создавать подклассы.

При уничтожении объекта вызывается деструктор родительского класса, поэтому он должен существовать,Это применимо, является ли деструктор чисто виртуальным или нет.Чистая виртуальная функция-член должна быть определена только при явном вызове Foo:theFunc().

2 голосов
/ 10 марта 2011

В случае чисто виртуального деструктора нет способа «заставить» кого-либо реализовывать его в производных классах.Компилятор напишет один для вас.Кроме того, созданный компилятором деструктор (в производном классе) будет вызывать родительский деструктор - так что вам лучше написать реализацию для родителя.

Итак, подведем итог:

  1. Чистая виртуальная функция, которая не является деструктором, не должна иметь реализацию, так как вы не ожидаете, что ее вызовет программист.
  2. Чистый виртуальный деструктор должен иметь реализацию, так как компилятор обязан вызывать ее из деструкторов.(написан как программист, так и компилятор) в дочерних классах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...