5

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

struct B 
{ 
    virtual ~B() {} 
}; 

struct D : public B 
{ 
    ~D() {} 
}; 

Итак, когда я называю

B* b = new D; 

b->~B(); 

почему деструктор производного класса под названием? Он виртуальный, но мы называем деструктор по имени или есть скрытое имя деструктора, которое является одинаковым для всех классов?

ответ

11

Деструктор не имеет имени, самого себя. Для класса C синтаксис ~C используется для обозначения одиночного, безымянного деструктора.

В вашем случае ~B поэтому просто означает «деструктор». Поскольку он виртуальный, динамическая отправка происходит во время выполнения при деструкторе D.

Если вы сделали это вместо:

b->B::~B(); 

было бы отключить динамической диспетчеризации (как и любой другой квалифицированный вызов делает), и вы бы назвали B «s только деструктор.

Смежные вопросы