Как я понимаю, цель создания виртуальной функции чисто виртуальной состоит в том, чтобы заставить производные классы либо предоставить реализацию для нее, либо выбрать реализацию по умолчанию с помощью явно записи Base::f()
в Derived::f()
.
Итак, если это правда, тогда какова цель создания виртуального деструктора pure virtual
?Вынуждает ли производные классы обеспечивать реализацию для Base::~Base()
?Могут ли производные классы реализовать Base::~Base()
?Нет.
Значит, первая версия с деструктором virtual
кажется достаточной для почти всех целей.В конце концов, наиболее распространенная цель виртуального деструктора состоит в том, что клиенты могут правильно delete
объекты производных классов через указатели типа Base*
.
Однако, если вы сделаете все функции в Base
только виртуальные , не pure virtual и предоставите для них реализации (на самом деле выпредоставить), и в то же время вы хотите создать Base
абстрактный тип , тогда виртуальный деструктор pure в Base
будет only решение:
class Base
{
public:
virtual void f() {}; //not pure virtual
virtual ~Base() = 0; //pure - makes Base abstract type!
};
Base::~Base() {} //yes, you have to do this as well.
Base *pBase = new Base(); // error - cannot create instance!
Надеюсь, это поможет.