Оптимизация и исправление кода (вариант 4)

Код не компилируется из-за закрытого наследования и отсутствия вызова Foo(j). Кроме того, delete не соответствует new[], копирование поверхностное, а удаление Bar через Foo* небезопасно.

Короткий ответ

Что ответить на собеседовании

Код не компилируется из-за закрытого наследования и отсутствия вызова Foo(j). Кроме того, delete не соответствует new[], копирование поверхностное, а удаление Bar через Foo* небезопасно.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо переписать представленный фрагмент, устранив ошибки управления памятью и нарушения принципов ООП.

class Foo
{
public:
    Foo(int j) { i = new int[j]; }
    ~Foo() { delete i; }
private:
    int* i;
};

class Bar : Foo
{
public:
    Bar(int j) { i = new char[j]; }
    ~Bar() { delete i; }
private:
    char* i;
};

void main()
{
    Foo* f = new Foo(100);
    Foo* b = new Bar(200);
    *f = *b;
    delete f;
    delete b;
}

Ответ

Код не компилируется из-за закрытого наследования и отсутствия вызова Foo(j). Кроме того, delete не соответствует new[], копирование поверхностное, а удаление Bar через Foo* небезопасно.

Поля i у Foo и Bar разные. Исправление для действительно необходимого публичного наследования:

#include <memory>
#include <vector>

class Foo {
    std::vector<int> values;
public:
    explicit Foo(int n) : values(n) {}
    virtual ~Foo() = default;
};

class Bar : public Foo {
    std::vector<char> bytes;
public:
    explicit Bar(int n) : Foo(n), bytes(n) {}
};

int main() {
    auto f = std::make_unique<Foo>(100);
    std::unique_ptr<Foo> b = std::make_unique<Bar>(200);
    *f = *b;
}

Предполагается n >= 0. Vector обеспечивает владение и глубокое копирование; виртуальный деструктор позволяет удалить производный объект через базовый указатель. Присваивание здесь копирует только часть Foo, не весь Bar. Если нужно полиморфное копирование, требуется отдельный clone-контракт. Стандартная точка входа — int main(), не void main().

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее