Удаление производного класса без новых членов через указатель на базовый класс

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

Представьте себе, следующий дизайн. Базовый класс имеет защищенный конструктор, поэтому его нельзя создать напрямую. Единственная цель производного класса здесь - разрешить создание базового класса некоторым классом Factory. Фабрика создает производный класс и возвращает указатель на базовый класс. В конце концов, когда указанный экземпляр удаляется пользователем, деструктор производного класса, конечно, не будет вызываться, но я не уверен, если это необходимо, поскольку производный класс не добавляет новых данных. Я хотел бы выяснить, какие проблемы (если таковые имеются) возможны в этом случае.

class Base
{
public:
    ~Base() = default;

protected:
    Base(int x, int y): x(x), y(y) {}

private:
    int x, y;
};

class Factory
{
    // privately declared Derived class exposes protected constructor from the Base class
    class Derived : public Base
    {
    public:
        Derived(int x, int y) : Base(x, y) {}
        ~Derived() = default;
    };

public:

    Base* create(int x, int y)
    {
        return new Derived(x, y);
    }
};  // Factory


int main()
{
    Factory factory;
    Base *base = factory.create(3, 4);
    delete base;
}

Всего 1 ответ


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

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


Есть идеи?

10000