Деструкторы в производных классах
От: sasasasa  
Дата: 28.11.03 12:36
Оценка:
Подскажите пожалуйста как избавиться от вызова деструктора базового класса при разрушении производного.
class A
{
~A();//
}

class B : public A
{
~B();// надо вызывать только ~B() а не ~B() а потом ~A()
}

Заранее спасибо.
Re: Деструкторы в производных классах
От: Vamp Россия  
Дата: 28.11.03 12:43
Оценка: +1
Никак. Невозможно и не может быть нужно.
Да здравствует мыло душистое и веревка пушистая.
Re: Деструкторы в производных классах
От: Bell Россия  
Дата: 28.11.03 12:55
Оценка:
Здравствуйте, sasasasa, Вы писали:

Вызов деструктора подобъекта базового класса при разрушении объекта производного класса — это фундаментальное свойство языка С++, и "избавиться" от этого невозможно.

ЗЫ
Очень любопытно, откуда выползла такая необходимость...
Любите книгу — источник знаний (с) М.Горький
Re: Деструкторы в производных классах
От: Denwer Россия  
Дата: 28.11.03 12:58
Оценка:
Здравствуйте, sasasasa, Вы писали:

S>Подскажите пожалуйста как избавиться от вызова деструктора базового класса при разрушении производного.

S>class A
S>{
S> ~A();//
S>}

S>class B : public A

S>{
S> ~B();// надо вызывать только ~B() а не ~B() а потом ~A()
S>}

S>Заранее спасибо.


Ну как уже сказали это не возможно и не нужно, это конечно правельно, но если тебе это так нужно можешь просто объявить указатель и не использовать наследование, это единственное что можно сделать.

ЗЫ: А можнои ссылку объявить, что даже лучше будет.
Re[2]: Деструкторы в производных классах
От: Vamp Россия  
Дата: 28.11.03 13:06
Оценка:
D>ЗЫ: А можнои ссылку объявить, что даже лучше будет.
При создании ссылки ее необходимо инициализировать существующим объектом, при удалении которого вызовется деструктор.
Да здравствует мыло душистое и веревка пушистая.
Re[3]: Деструкторы в производных классах
От: Аноним  
Дата: 28.11.03 13:11
Оценка:
Да, но если держатель ссылки умирает раньше объекта, который использовался как инициализатор ссылки, то все ОК.
Re[3]: Деструкторы в производных классах
От: Denwer Россия  
Дата: 28.11.03 13:16
Оценка:
Здравствуйте, Vamp, Вы писали:

D>>ЗЫ: А можнои ссылку объявить, что даже лучше будет.

V>При создании ссылки ее необходимо инициализировать существующим объектом, при удалении которого вызовется деструктор.

CString &s = *new CString();
Re[4]: Деструкторы в производных классах
От: sasasasa  
Дата: 28.11.03 13:52
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Здравствуйте, Vamp, Вы писали:


D>>>ЗЫ: А можнои ссылку объявить, что даже лучше будет.

V>>При создании ссылки ее необходимо инициализировать существующим объектом, при удалении которого вызовется деструктор.

D>
D>CString &s = *new CString();
D>



Всем Спасибо Понял!
Re[2]: Деструкторы в производных классах
От: sasasasa  
Дата: 28.11.03 14:03
Оценка:
Здравствуйте, 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()

помогите чем можете
Re[5]: Деструкторы в производных классах
От: sasasasa  
Дата: 28.11.03 14:04
Оценка:
Здравствуйте, 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()

помогите чем можете
Re[6]: Деструкторы в производных классах
От: Анатолий Широков СССР  
Дата: 28.11.03 14:07
Оценка:
Сделай деструктор виртуальным — это и будет твоя функция fn().
Re[6]: Деструкторы в производных классах
От: Vamp Россия  
Дата: 28.11.03 14:25
Оценка:
Когда у тебя вызывается деструктор базового класса, потомка уже не существует. И вызвать функции потомка деструктор не может.
Реализуй все дополнительные деймствия, не относящиеся к А прямо в деструткоре B.
Да здравствует мыло душистое и веревка пушистая.
Re: Деструкторы в производных классах
От: KIT75  
Дата: 28.11.03 14:27
Оценка: -1
Здравствуйте, sasasasa, Вы писали:

S>Подскажите пожалуйста как избавиться от вызова деструктора базового класса при разрушении производного.

S>class A
S>{
S> ~A();//
S>}

S>class B : public A

S>{
S> ~B();// надо вызывать только ~B() а не ~B() а потом ~A()
S>}

S>Заранее спасибо.


Такая цепочка вызова деструкторов работает только если деструктор объявлен виртуальным.
В данном примере этого не видно
Re[3]: Деструкторы в производных классах
От: Bell Россия  
Дата: 28.11.03 14:31
Оценка:
Здравствуйте, sasasasa, Вы писали:

Уууу как все запущено — то! Щас тебе достанется
А теперь серьезно — в С++ в конструкторе/деструкторе виртуальную функцию нельзя вызвать "виртуально" — возможна только статическая привязка. Т.е. при вызове вирт. функции из конструктора/деструктора происходит вызов варианта этой функции, определенной в данном классе (т.е. в классе, чей дестркутор выполняется в данный момент).
Этот вопрос обсуждался тут множество раз — воспользуйся поиском.
Начать можно отсюда
Автор: Андрей Тарасевич
Дата: 18.06.02
Любите книгу — источник знаний (с) М.Горький
Re[2]: Деструкторы в производных классах
От: Bell Россия  
Дата: 28.11.03 14:35
Оценка:
Здравствуйте, KIT75, Вы писали:


KIT>Такая цепочка вызова деструкторов работает только если деструктор объявлен виртуальным.

Да ну?


struct B
{
  ~B() { cerr << "~B()" << endl; }
};

struct D : public B
{
  ~D() { cerr << "~D()" << endl; }
};

int main()
{

   D d;

   return 0;
}



Любите книгу — источник знаний (с) М.Горький
Re[4]: Деструкторы в производных классах
От: sasasasa  
Дата: 28.11.03 14:39
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, sasasasa, Вы писали:


B>Уууу как все запущено — то! Щас тебе достанется

B>А теперь серьезно — в С++ в конструкторе/деструкторе виртуальную функцию нельзя вызвать "виртуально" — возможна только статическая привязка. Т.е. при вызове вирт. функции из конструктора/деструктора происходит вызов варианта этой функции, определенной в данном классе (т.е. в классе, чей дестркутор выполняется в данный момент).
B>Этот вопрос обсуждался тут множество раз — воспользуйся поиском.
B>Начать можно отсюда
Автор: Андрей Тарасевич
Дата: 18.06.02



Спасибо за науку
Re: Деструкторы в производных классах
От: WolfHound  
Дата: 28.11.03 18:31
Оценка:
Здравствуйте, sasasasa, Вы писали:

Дай угадаю... Дельфист?
... << RSDN@Home 1.1 beta 2 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Деструкторы в производных классах
От: Андрей Тарасевич Беларусь  
Дата: 29.11.03 22:43
Оценка:
Здравствуйте, Bell, Вы писали:

B>Уууу как все запущено — то! Щас тебе достанется

B>А теперь серьезно — в С++ в конструкторе/деструкторе виртуальную функцию нельзя вызвать "виртуально" — возможна только статическая привязка.

Это, строго говоря, неверно. В общем случае вызовы должны остаться виртуальными, но в качестве динамического типа объекта должен использоваться тот тип, деструктор которого работает в данный момент. Заменить виртуальный вызов на статический можно только в тривиальных случаях, типа вызова виртуального метода непосредственно из конструктора/деструктора.
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.