Код не компилируется из-за закрытого наследования и отсутствия вызова Foo(j). Кроме того, delete не соответствует new[], копирование поверхностное, а удаление Bar через Foo* небезопасно.
Оптимизация и исправление кода (вариант 4)
Код не компилируется из-за закрытого наследования и отсутствия вызова 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().