Почему компилятор вызывает сначала деструктор В,а потом А. Почему одного деструктора В не хватает ? И есть разница в данных записях:
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
Каждый объект класса B содержит объект класса A в качестве базового подобъекта. Разумеется, для этого подобъекта будет вызываться деструктор класса A. Как же еще?
Деструкторы в С++ традиционно вызываются в порядке, обратном порядку конструкции. Конструкция делается в порядке от подобъектов ко всему объекту. Деструкция - в обратном порядке: сначала деструктор объекта, потом деструкторы его подобъектов.
Разница в записях new A и new B, разумеется, есть. По-моему очевидно, что в первом случае создается объект класса A, а во втором - класса B.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости