Вызовы деструктора класса

108
14 июня 2021, 03:20

Почему компилятор вызывает сначала деструктор В,а потом А. Почему одного деструктора В не хватает ? И есть разница в данных записях:

const A *a = new B;
const A *a = new А;

Вот сам код:

class A
{
public: 
    virtual ~A() { f(); }
public:
    virtual void f() const { std::cout << 1; }
};
class B: public A
{
public:
    ~B() { f(); }
private:
    virtual void f() const { std::cout << 2; }
};
int main()
{
    const A *a = new B;
    delete a;
    return 0;
}

Вывод:

21
Answer 1

Каждый объект класса B содержит объект класса A в качестве базового подобъекта. Разумеется, для этого подобъекта будет вызываться деструктор класса A. Как же еще?

Деструкторы в С++ традиционно вызываются в порядке, обратном порядку конструкции. Конструкция делается в порядке от подобъектов ко всему объекту. Деструкция - в обратном порядке: сначала деструктор объекта, потом деструкторы его подобъектов.

Разница в записях new A и new B, разумеется, есть. По-моему очевидно, что в первом случае создается объект класса A, а во втором - класса B.

READ ALSO
Ошибка компиляции, thread C++

Ошибка компиляции, thread C++

Выдаёт ошибку:

98
Как получить открытый ключ из структуры DH

Как получить открытый ключ из структуры DH

Пытаюсь испробовать в действии алгоритм Диффи-ХеллманаВзял код отсюда:

83
c++ lambda expression пр компиляции

c++ lambda expression пр компиляции

Во многих гуидах написано, что лямбда выражения в с++ это всего лишь синтаксический сахар для анонимных функторовНо при обработке, скажем,...

106