Почему компилятор вызывает сначала деструктор В,а потом А. Почему одного деструктора В не хватает ? И есть разница в данных записях:
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
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пытаюсь испробовать в действии алгоритм Диффи-ХеллманаВзял код отсюда:
Во многих гуидах написано, что лямбда выражения в с++ это всего лишь синтаксический сахар для анонимных функторовНо при обработке, скажем,...