C++ C++  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Наследование и виртуальные функции

Тест проверяет границу между “является” и “использует”, статический и динамический тип, скрытие перегрузок и безопасное разрушение полиморфных объектов. Вопросы построены так, чтобы привычная фраза про virtual не заменяла точный разбор вызова.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 20 вопросов, время — 55 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 20
Какой смысл обычно имеет public-наследование?
C++C++20
struct Shape {
    virtual double area() const = 0;
    virtual ~Shape() = default;
};
struct Circle final : Shape {
    double area() const override;
};
void print_area(const Shape& shape);
Вопрос 2 из 20
Может ли метод производного класса напрямую читать private-поле базового?
Вопрос 3 из 20
Что произойдёт при `Base b = Derived{};`?
C++C++20
struct Base { virtual ~Base() = default; };
struct Derived : Base { int extra = 42; };
Base b = Derived{};
Вопрос 4 из 20
Почему наследовать `Square` от изменяемого `Rectangle` с независимыми set_width/set_height часто проблематично?
C++C++20
class Rectangle {
public:
    virtual void set_width(int w) { width_ = w; }
    virtual void set_height(int h) { height_ = h; }
    int area() const { return width_ * height_; }
protected:
    int width_ = 1, height_ = 1;
};

class Square : public Rectangle {
public:
    void set_width(int w) override { width_ = height_ = w; }
    void set_height(int h) override { width_ = height_ = h; }
};
Вопрос 5 из 20
Когда композиция обычно лучше наследования?
Вопрос 6 из 20
Какое имя выведет виртуальный вызов через ссылку Base&?
C++C++20
#include <iostream>
struct Base { virtual void name(){ std::cout << "base"; } };
struct Derived : Base { void name() override { std::cout << "derived"; } };
void show(Base& x){ x.name(); }
int main(){ Derived d; show(d); }
Вопрос 7 из 20
Что происходит с виртуальным вызовом из конструктора Base?
Вопрос 8 из 20
Что означает `virtual void draw() = 0;`?
C++C++20
struct Shape {
    virtual ~Shape() = default;
    virtual void draw(Canvas&) const = 0;
};

struct Circle final : Shape {
    void draw(Canvas&) const override;
};
Вопрос 9 из 20
Можно ли вызвать static-метод виртуально?
Вопрос 10 из 20
Почему вызов виртуальной функции из деструктора Base не попадёт в Derived?
Вопрос 11 из 20
Зачем писать override?
Вопрос 12 из 20
Почему код не компилируется?
C++C++20
struct Base { virtual int value() const; };
struct Derived : Base { int value() override; };
Вопрос 13 из 20
Что делает final у виртуального метода?
Вопрос 14 из 20
Какой возвращаемый тип может быть ковариантным при переопределении?
Вопрос 15 из 20
Что случилось в этом коде?
C++C++20
struct Base { virtual void f(int); };
struct Derived : Base { void f(double); };
Вопрос 16 из 20
Каково поведение `delete p`, если Base не имеет виртуального деструктора, а p указывает на Derived?
C++C++20
struct Base {
    ~Base() { std::cout << "Base"; }
};
struct Derived : Base {
    ~Derived() { std::cout << "Derived"; }
};

Base* p = new Derived;
delete p;
Вопрос 17 из 20
Какой дизайн уместен для базового интерфейса, объекты которого удаляются через `std::unique_ptr<Base>`?
C++C++20
struct Device {
    virtual ~Device() = default;
    virtual void start() = 0;
};

std::unique_ptr<Device> make_device() {
    return std::make_unique<UsbDevice>();
}
Вопрос 18 из 20
Зачем иногда делают невиртуальный деструктор Base protected?
Вопрос 19 из 20
Должен ли pure virtual-деструктор иметь определение?
Вопрос 20 из 20
Какая строка вывода ожидается?
C++C++20
#include <iostream>
struct B { virtual ~B(){ std::cout << "B"; } };
struct D : B { ~D(){ std::cout << "D"; } };
int main(){ B* p = new D; delete p; }

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу