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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 14:15   #1
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию Почему виртуальные методы и деструкторы нельзя делать шаблонными???

Выдержка из Солтера с Клепером:
Цитата:
Виртуальные методы и деструкторы нельзя делать шаблонными
ладно думаю, ща проверим, пишу:
Код:
template<typename T>
class A
{
public:
	A(){}
	virtual void func(){ cout << "A" << endl;}
	virtual ~A(){cout << "A - deleted" << endl;}
};
template<typename T>
class B: public A<T>
{
public:
	B(): A<T>(){}
	virtual void func(){cout << "B" << endl;}
	virtual ~B(){cout << "B - deleted" << endl;}
};
void main()
{
	A<int> *a1 = new A<int>();
	delete a1;

	A<int> *a2 = new B<int>();
	a2->func();
	delete a2;
}
Все компилится и линкуется и работает как надо, только не пойму в чем прикол?
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Старый 14.12.2010, 14:30   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

ну и где у тебя тут виртуальный метод или деструктор шаблонный? у тя шаблонен класс!
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 вне форума Ответить с цитированием
Старый 14.12.2010, 14:42   #3
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
ну и где у тебя тут виртуальный метод или деструктор шаблонный? у тя шаблонен класс!
хорошо, а можно примерчик. Спасибо.
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Старый 14.12.2010, 15:03   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
class Base {
public:
	virtual ~Base()
	{

	}

	template <typename A>
	virtual void foo(A a)
	{

	}
};

class A : public Base {
public:
};

int main()
{
	A a;
	return 0;
}
как тебе и обещали. но

Код:
class Base {
public:
	virtual ~Base()
	{

	}

	template <typename A>
	void foo(A a)
	{
		cout << a << endl;
	}
};

class A : public Base {
public:
};

int main()
{
	A a;
	a.foo(10);
	a.foo('c');
	a.foo("123");
	return 0;
}

а почему нельзя - это и так понятно.
base::foo(T&);
impl::foo(T&);
base->foo(val); // base - указатель на impl
несоответствие
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; 14.12.2010 в 16:01.
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему нельзя разбивать на отдельные файлы шаблонные функции и классы? lordius Visual C++ 22 08.07.2010 09:49
Виртуальные методы Kn793 Общие вопросы C/C++ 5 26.06.2010 15:08
Почему из метода класса нельзя обратиться к компоненту на форме? Дима я Общие вопросы Delphi 2 28.03.2010 13:21
почему под созданным пользователем нельзя зайти? Bat{CMD}_Men Общие вопросы Delphi 1 04.11.2009 10:47
Полиморфизм и виртуальные методы Викдон Общие вопросы Delphi 1 02.02.2009 04:40