Sobes.tech
Junior — Senior
63

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

Условие задачи

Опишите, в чём заключается проблема, возникающая при удалении объектов через указатель базового типа (Base*). Какой результат будет при выполнении delete baseChild; и delete baseChildChild;? Объясните, почему такое поведение считается опасным.

struct Base {
    virtual void baseFunc0() {
        std::cout << "Base::baseFunc0" << std::endl;
    }
};

struct Child : Base {
    void baseFunc0() override {
        std::cout << "Child::baseFunc0" << std::endl;
    }
};

struct ChildChild : Child {
    void baseFunc0() override {
        std::cout << "ChildChild::baseFunc0" << std::endl;
    }
};

void run() {
    Base base;
    Base* baseChild = new Child;
    Base* baseChildChild = new ChildChild;

    base.baseFunc0();
    baseChild->baseFunc0();
    baseChildChild->baseFunc0();

    delete baseChild;
    delete baseChildChild;
}