Вызов деструктора подобъекта базового класса при разрушении объекта производного класса — это фундаментальное свойство языка С++, и "избавиться" от этого невозможно.
ЗЫ
Очень любопытно, откуда выползла такая необходимость...
Здравствуйте, sasasasa, Вы писали:
S>Подскажите пожалуйста как избавиться от вызова деструктора базового класса при разрушении производного. S>class A S>{ S> ~A();// S>}
S>class B : public A S>{ S> ~B();// надо вызывать только ~B() а не ~B() а потом ~A() S>}
S>Заранее спасибо.
Ну как уже сказали это не возможно и не нужно, это конечно правельно, но если тебе это так нужно можешь просто объявить указатель и не использовать наследование, это единственное что можно сделать.
ЗЫ: А можнои ссылку объявить, что даже лучше будет.
D>ЗЫ: А можнои ссылку объявить, что даже лучше будет.
При создании ссылки ее необходимо инициализировать существующим объектом, при удалении которого вызовется деструктор.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Деструкторы в производных классах
От:
Аноним
Дата:
28.11.03 13:11
Оценка:
Да, но если держатель ссылки умирает раньше объекта, который использовался как инициализатор ссылки, то все ОК.
Здравствуйте, Vamp, Вы писали:
D>>ЗЫ: А можнои ссылку объявить, что даже лучше будет. V>При создании ссылки ее необходимо инициализировать существующим объектом, при удалении которого вызовется деструктор.
Здравствуйте, Denwer, Вы писали:
D>Здравствуйте, Vamp, Вы писали:
D>>>ЗЫ: А можнои ссылку объявить, что даже лучше будет. V>>При создании ссылки ее необходимо инициализировать существующим объектом, при удалении которого вызовется деструктор.
D>
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, sasasasa, Вы писали:
B>Вызов деструктора подобъекта базового класса при разрушении объекта производного класса — это фундаментальное свойство языка С++, и "избавиться" от этого невозможно.
B>ЗЫ B>Очень любопытно, откуда выползла такая необходимость...
Просто хотелось бы чтобы в деструкторе бозового класса виртуальные функции вызывались не базового класса а производного напр:
class A
{
~A();
virtual void fn();
};
A::~A()
{
fn();
}
class B
{
~B();
virtual void fn();
}
B::~B()
{
}
...
delete B; // вызывается A::fn() а хотелось бы B::fn()
Здравствуйте, sasasasa, Вы писали:
S>Здравствуйте, Denwer, Вы писали:
D>>Здравствуйте, Vamp, Вы писали:
D>>>>ЗЫ: А можнои ссылку объявить, что даже лучше будет. V>>>При создании ссылки ее необходимо инициализировать существующим объектом, при удалении которого вызовется деструктор.
D>>
D>>CString &s = *new CString();
D>>
S>Всем Спасибо Понял!
точнее не понял :
Просто хотелось бы чтобы в деструкторе бозового класса виртуальные функции вызывались не базового класса а производного напр:
class A
{
~A();
virtual void fn();
};
A::~A()
{
fn();
}
class B
{
~B();
virtual void fn();
}
B::~B()
{
}
...
delete B; // вызывается A::fn() а хотелось бы B::fn()
Когда у тебя вызывается деструктор базового класса, потомка уже не существует. И вызвать функции потомка деструктор не может.
Реализуй все дополнительные деймствия, не относящиеся к А прямо в деструткоре B.
Здравствуйте, sasasasa, Вы писали:
S>Подскажите пожалуйста как избавиться от вызова деструктора базового класса при разрушении производного. S>class A S>{ S> ~A();// S>}
S>class B : public A S>{ S> ~B();// надо вызывать только ~B() а не ~B() а потом ~A() S>}
S>Заранее спасибо.
Такая цепочка вызова деструкторов работает только если деструктор объявлен виртуальным.
В данном примере этого не видно
Уууу как все запущено — то! Щас тебе достанется
А теперь серьезно — в С++ в конструкторе/деструкторе виртуальную функцию нельзя вызвать "виртуально" — возможна только статическая привязка. Т.е. при вызове вирт. функции из конструктора/деструктора происходит вызов варианта этой функции, определенной в данном классе (т.е. в классе, чей дестркутор выполняется в данный момент).
Этот вопрос обсуждался тут множество раз — воспользуйся поиском.
Начать можно отсюда
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, sasasasa, Вы писали:
B>Уууу как все запущено — то! Щас тебе достанется B>А теперь серьезно — в С++ в конструкторе/деструкторе виртуальную функцию нельзя вызвать "виртуально" — возможна только статическая привязка. Т.е. при вызове вирт. функции из конструктора/деструктора происходит вызов варианта этой функции, определенной в данном классе (т.е. в классе, чей дестркутор выполняется в данный момент). B>Этот вопрос обсуждался тут множество раз — воспользуйся поиском. B>Начать можно отсюда
Здравствуйте, Bell, Вы писали:
B>Уууу как все запущено — то! Щас тебе достанется B>А теперь серьезно — в С++ в конструкторе/деструкторе виртуальную функцию нельзя вызвать "виртуально" — возможна только статическая привязка.
Это, строго говоря, неверно. В общем случае вызовы должны остаться виртуальными, но в качестве динамического типа объекта должен использоваться тот тип, деструктор которого работает в данный момент. Заменить виртуальный вызов на статический можно только в тривиальных случаях, типа вызова виртуального метода непосредственно из конструктора/деструктора.