Может ли класс все еще быть чисто абстрактным, если он имеет не чистый деструктор? - PullRequest
1 голос
/ 28 сентября 2011

Я работаю над упражнением, в котором меня просят взять базовый класс Rodent и сделать его чисто абстрактным классом. Мое понимание чистого абстрактного класса состоит в том, что он действует как интерфейс и содержит только чисто виртуальные функции. Хотя это простое упражнение, у меня есть проблема с решением, предоставленным в книге:

class Rodent
{
    public:

    virtual ~Rodent() {cout << "Destroy rodent" << endl;}
    virtual void run() = 0;
    virtual void squeak() = 0;
};

Как видите, автор добавил фиктивное определение деструктора. Не означает ли добавление этого определения, что это абстрактный класс, а не «чистый» абстрактный класс?

Ответы [ 6 ]

5 голосов
/ 28 сентября 2011

Абстрактный класс должен содержать по крайней мере одну чисто виртуальную функцию.

В вашем классе уже есть две чистые виртуальные функции run() и squeak(), поэтому ваш класс является абстрактным из-за этих двух чисто виртуальных функций.

Вы не можете создавать объекты этого класса.

РЕДАКТИРОВАТЬ:

Чистый абстрактный класс, это класс, который имеет исключительно чистые виртуальные функции (и не содержит данных).Поскольку ваш деструктор не является чисто виртуальным, ваш класс не является Чистым абстрактным классом.

3 голосов
/ 28 сентября 2011

Деструктор требуется для каждого класса по правилам C ++.Если вы его не предоставите, компилятор сгенерирует его для вас.

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

2 голосов
/ 28 сентября 2011

Рассмотрите возможность реализации вашего интерфейса следующим образом

class Rodent {
public:
  virtual ~Rodent() = 0;
  virtual void run() = 0;
  virtual void squeak() = 0;
};
inline Rodent::~Rodent() {}

При указании деструктора как чисто виртуального и вставке реализации в MSVC2010 исключается следующее предупреждение при экспорте подклассов:

warning C4275: non dll-interface class 'A' used as base for dll-interface class 'B'
2 голосов
/ 28 сентября 2011

Насколько я понимаю, стандарт C ++ не определяет чистый абстрактный класс . Однако C ++ 0x (n3290) определяет абстрактный класс .

10.4 / 2 Класс является абстрактным, если у него есть хотя бы один чистый виртуальный функция.

чистый абстрактный класс является общепринятым термином и описывает абстрактный класс , который;

  • не имеет членов данных
  • не имеет каких-либо не чистых виртуальных функций
  • не имеет никаких конкретных функций

указано пользователем.

Итак, согласно этому соглашению class Rodent не является чистым абстрактным классом .

2 голосов
/ 28 сентября 2011

Ключевое слово virtual означает что-то немного другое для деструкторов. Когда dtors базового класса являются виртуальными, это означает, что all dtors в иерархии наследования вызываются. Вы не можете переопределить это как таковое.

Обычно вы ожидаете, что он будет пустым:

class Rodent {
public:
  virtual ~Rodent() {}
  virtual void run() = 0;
  virtual void squeak() = 0;
};

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

Не думаю, что вы кого-то смущаете, называя свое чисто виртуальным.

1 голос
/ 28 сентября 2011

Да, это уже не чистый класс.Чистый абстрактный класс не имеет никакой функциональности, он просто предоставляет структуру.cout - это функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...