Выделение памяти для дополнительных элементов данных подкласса при назначении его объекта указателю его суперкласса - PullRequest
0 голосов
/ 08 декабря 2018

Я изучаю ООП из книги автора Абхирама Ранаде, и у меня есть концептуальные сомнения в отношении виртуальных деструкторов.

Говоря о смешении назначений с объектами суперкласса и подкласса, он говорит, что если 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, это не должно быть неопределенное поведение.Где я не прав?

...