если у меня есть два класса:
class A
{
public:
virtual print(){};
~A(){print();}
};
class B:public A
{
public:
print(){};
~B(){}
};
void main()
{
B *b1=new B;
delete b1;
}
в деструкторе класса A он вызывает печать из класса A, а не из B, потому что, когда он находится в деструкторе класса A, класс B технически разрушен?
Да все верно. Класс разрушается путем вызова деструктора для себя, а затем деструктор для его родительских классов, что означает, что к тому времени, когда вы уничтожили A, B, уже исчез. Вы увидите подобное поведение, если при создании вы вызываете виртуальные, переопределяете функции в базовых классах.
Обычно считается неправильной практикой вызывать виртуальные функции в конструкторах или деструкторах, поскольку поведение, хотя и четко определено, может вводить в заблуждение непосвященному. Кроме того, вы можете легко подняться, даже если вы начали.