Я изучаю ООП из книги автора Абхирама Ранаде, и у меня есть концептуальные сомнения в отношении виртуальных деструкторов.
Говоря о смешении назначений с объектами суперкласса и подкласса, он говорит, что если B является подклассом A, то первые два назначения ниже разрешены, а обратное - нет.Дополнительные члены группы B, не входящие в группу A, удаляются.
a = b
PtrA = &b
Однако, когда речь идет о виртуальных деструкторах;давайте возьмем следующий код.
class A {
public:
virtual ~A() {cout<<"~A.\n";}
};
class B: public A{
int *z;
public :
B(){z = new int;}
~B(){
out <<"~B.\n";
delete z;
}
};
int main(){
A* aptr;
aptr = new B;
delete aptr;
}
В книге говорится, что если мы не объявим деструктор A виртуальным, то после операции delete aptr;в основной программе память, выделенная для z, не будет освобождена.
Чего я не понимаю, так это то, что когда мы присваиваем объект типа B указателю типа A, разве дополнительные элементы, такие как int z, не должны вообще отбрасываться?Почему тогда память будет выделяться для z?
Дополнительные члены B, которых нет в A, должны быть отброшены, и, следовательно, даже если вызывается только деструктор для A, это не должно быть неопределенное поведение.Где я не прав?