Image

Imageborisovs wrote in Imageru_cpp

Вопрос от Яндекса

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;
}
Перечислите все проблемы, которые вы видите в данном коде:

Я вижу 3 проблемы.
1) В базовом классе отсутствует конструктор по умолчанию (без аргументов). Класс наследник не сможет вызвать конструктор базового класса и сам не сможет быть создан
2)*f=*b; массиву из 100 элементов присваивается массив из 200 элементов - выход за пределы массива.
3) Так как в классе Bar  деструктор не виртуальный
~Bar() { delete i; }

вот здесь:

delete b;

будет вызван деструктор базового класса - утечка памяти
Так? Или я что то пропустил?
Меня ещё смущают масивы, но вроде как char не равен int так как 1байт !=4
Хотя переменная скажем char=65 может вот так инициализироваться