delete / multiple inheritance
8 отговора
476 прегледа
delete / multiple inheritance
днес се замислих върху следното:
ако имам:
class A {virtual ~A();};
class B {virtual ~B();};
class C: public A, public B {virtual ~C();};
и после:
{
C *c = new C;
B *b = c;
delete b;
}
че стойностите на b и c са различни е ясно
че деструкторите ще се извикат коректно, ок
това което ме тормози е какъв адрес ще бъде подаден на менажера на паметта, след като стойността на b не сочи в началото на блока?
ако имам:
class A {virtual ~A();};
class B {virtual ~B();};
class C: public A, public B {virtual ~C();};
и после:
{
C *c = new C;
B *b = c;
delete b;
}
че стойностите на b и c са различни е ясно
че деструкторите ще се извикат коректно, ок
това което ме тормози е какъв адрес ще бъде подаден на менажера на паметта, след като стойността на b не сочи в началото на блока?
Re: delete / multiple inheritance
подава се адресът на most derived обекта. за да се разбере кой е той трябва да има поне една виртуална функция, а по стандарт за такава е избран деструкторът.
5.3.5 Delete [expr.delete]
1 The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.
delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression
The first alternative is for non-array objects, and the second is for arrays. The operand shall have a pointer type, or a class type having a single conversion function (12.3.2) to a pointer type. The result has type void.
...
3 In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand's dynamic type and the static type shall have a virtual destructor or the behavior is undefined. In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.73)
unsigned
5.3.5 Delete [expr.delete]
1 The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.
delete-expression:
::opt delete cast-expression
::opt delete [ ] cast-expression
The first alternative is for non-array objects, and the second is for arrays. The operand shall have a pointer type, or a class type having a single conversion function (12.3.2) to a pointer type. The result has type void.
...
3 In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand's dynamic type and the static type shall have a virtual destructor or the behavior is undefined. In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.73)
unsigned
Re: delete / multiple inheritance
Programmer's rule #9: If you are not sure how something works, test it.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Re: delete / multiple inheritance
Щото преди него има още 8. 
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Re: delete / multiple inheritance
тествах го, само че гаранция франция, дали ще бачка на различни компилатори и какви странични ефекти може да има
Re: delete / multiple inheritance
Абе я ти вземи парите, пък предложи 1 месец безплатен съпорт и бъгфиксинг.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Редактирано от Duncan Griffin на
Re: delete / multiple inheritance
идеята я бива, ама съм на заплата
а мразя да си уплътнявам времето с дебъгване.
единственото което мразя повече е четене на чужд код и естествено, върха на черешката, дебъгване на чужди лайна
а мразя да си уплътнявам времето с дебъгване.
единственото което мразя повече е четене на чужд код и естествено, върха на черешката, дебъгване на чужди лайна
Re: delete / multiple inheritance
абе зависи как е написан чуждия код, понякога е добре дошъл :)
но за чуждите лайна си абсолютно прав, да мрат лайнотворците!
но за чуждите лайна си абсолютно прав, да мрат лайнотворците!