Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2012, 04:36   #1
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию Не вызывается деструктор

Код работает нормально. Компилируется как вы понимаете тоже нормально. Только вот не пойму почему конструкторы классов Test_1 и Test_2 вызываются а деструкторы нет?

Я думаю потому что я удаляю не объекты классов Test_1 and Test_2 а массив указателей ITest. Если это так то для удаления объектов классов Test_1 and Test_2 надо определять метод удаления их? И есть еще одна мысль: не вызываются потому, что я не создал экземпляры классов, а передал адреса с помощью new

Код:
#include <iostream>
using namespace std;
//=========================================================//
extern void ExitFunc();
//=========================================================//
#ifdef interface
#undef interface
#endif //interface
#define interface struct
interface ITest
{
	virtual void Print() = 0;
};
#undef interface
class Test_1 : public ITest
{
public:
	Test_1() { cout << "Construct test_1" << endl; }
	~Test_1() { cout << "Destruct test_1" << endl; }
	virtual void Print() { cout << "Test_1" << endl; }
};
class Test_2 : public ITest
{
public:
	Test_2() { cout << "Construct test_2" << endl; }
	~Test_2() { cout << "Destruct test_2" << endl; }
	virtual void Print() { cout << "Test_2" << endl; }
};

int main()
{
	//Declaration and initialize
	ITest* test[2] = {new Test_1,new Test_2};
	//Operation
	test[0]->Print();
	test[1]->Print();
	delete test[2];
	delete test[1];
	//Exit
	ExitFunc();
	return 0;
}
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.

Последний раз редактировалось kineziz; 18.08.2012 в 04:42.
kineziz вне форума Ответить с цитированием
Старый 18.08.2012, 04:40   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Переделал вот так:

Код:
#include <iostream>
using namespace std;
//=========================================================//
extern void ExitFunc();
//=========================================================//
#ifdef interface
#undef interface
#endif //interface
#define interface struct
interface ITest
{
	virtual void Print() = 0;
	virtual void Delete() = 0;
};
#undef interface
class Test_1 : public ITest
{
public:
	Test_1() { cout << "Construct test_1" << endl; }
	~Test_1() { cout << "Destruct test_1" << endl; }
	virtual void Delete() { delete this; }
	virtual void Print() { cout << "Test_1" << endl; }
};
class Test_2 : public ITest
{
public:
	Test_2() { cout << "Construct test_2" << endl; }
	~Test_2() { cout << "Destruct test_2" << endl; }
	virtual void Delete() { delete this; }
	virtual void Print() { cout << "Test_2" << endl; }
};

int main()
{
	//Declaration and intialize
	ITest* test[2] = {new Test_1,new Test_2};
	//Operation
	test[0]->Print();
	test[1]->Print();
	test[0]->Delete();
	test[1]->Delete();
	//Exit
	ExitFunc();
	return 0;
}

Теперь все нормально. Но все равно правильно ли я думал почему не вызываются деструкторы
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 18.08.2012, 07:32   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Цитата:
Только вот не пойму почему конструкторы классов Test_1 и Test_2 вызываются а деструкторы нет?
Потому что книги по ООП надо читать хоть иногда.

Цитата:
Я думаю потому что я удаляю не объекты классов Test_1 and Test_2 а массив указателей ITest.
Покажите, где вы удаляете "массив указателей".

Цитата:
Если это так то для удаления объектов классов Test_1 and Test_2 надо определять метод удаления их?
Для этого деструкторы и придуманы + генерируется стандартный, если вы не описали свой.

Цитата:
не вызываются потому, что я не создал экземпляры классов, а передал адреса с помощью new
Бред. new и delete отлично знаю про конструкторы и деструкторы

Код:
	ITest* test[2] = {new Test_1,new Test_2};
           ...
	delete test[2];
	delete test[1];
Тут вызываются деструкторы, но деструткоры класса... ITest. Полиморфизм же.

Цитата:
Переделал вот так:
Не отнимайте хлеб у индусских программистов.

Все, что вам надо было сделать и это есть в книгах по ООП:
Код:
interface ITest
{
	virtual void Print() = 0;
           virtual void ~ITest(){};
};
p51x вне форума Ответить с цитированием
Старый 18.08.2012, 15:02   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2p51x
Цитата:
interface ITest
{
virtual void Print() = 0;
virtual void ~ITest(){};
};
Цитата:
Не отнимайте хлеб у индусских программистов.
какой ты самокритичный
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 18.08.2012, 15:54   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,706
По умолчанию

Копи-паст он такой...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему вызывается деструктор? MrGukk Общие вопросы C/C++ 13 23.08.2012 17:42
Не вызывается функция JS Dexes PHP 1 01.02.2012 10:57
Процедура не вызывается Точьичка Общие вопросы Delphi 6 25.09.2011 17:52
EnumThreadWndProc не вызывается bro Win Api 4 16.04.2011 23:00
не вызывается Paint в borland 5 primeplus Общие вопросы C/C++ 4 08.08.2009 08:14