powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Правильно ли это?
11 сообщений из 11, страница 1 из 1
Правильно ли это?
    #34686979
батрак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
template <class T> class Base
{	public:
		 virtual T*const Self(){	cout << "Base "; 
		                                return static_cast<T*const>(this);}
};

template <class T> class Derived :public Base<Derived<T> >
{	public:
		 virtual Derived<T>*const Self(){	cout << "Derived "; 
							return static_cast<Derived<T>*const>(this);}
};
int _tmain(int argc, _TCHAR* argv[])
{
	Derived<int> derived;
	derived.Self();
	static_cast<Base<Derived<int> > >(derived).Self();
}
На экран выводит:Derived Base
Правильно ли это ведь virtual T*const Self() и virtual Derived<T>*const Self() - по сути одно и тоже после вывода компилятором типа T и следовательно по правилу виртуальных перегруженных при наследовании функций должны получать на экране: Derived Derived
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687020
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твой оператор static_cast<Base<Derived<int> > > производит "срезку" объекта. Т.е. теперь ты имеешь объект по значению базового класса. Поэтому полиморфизм и не сработал.
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687026
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле, это пример более популярной ошибки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class A {
  public: virtual void func() {};
};

void func(A const &a) {
   a.func();
};

class B : public A {
  public: virtual void func() {};
}

int main() {
  func(B());
  return  0 ;
};

Здесь все нормуль, т.к. B мы передаем по ссылке. И полиморфизм нам даст в функции B::func(). Но стоит забыть написать значек &, как мы получаем срезку объекта при копировании. И теперь у нас в функции будет действительно объект класса A и произойдет вызов функции A::func().
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687051
батрак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkhТвой оператор static_cast<Base<Derived<int> > > производит "срезку" объекта. Т.е. теперь ты имеешь объект по значению базового класса. Поэтому полиморфизм и не сработал.

А если так static_cast<Base<Derived<int> > *>(?derived)->Self();
- то все должно быть ок я так понимаю?
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687059
батрак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
батракstatic_cast<Base<Derived<int> > *>(?derived)->Self();
вместо ? - & очепятка
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687070
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
батрак AkhТвой оператор static_cast<Base<Derived<int> > > производит "срезку" объекта. Т.е. теперь ты имеешь объект по значению базового класса. Поэтому полиморфизм и не сработал.

А если так static_cast<Base<Derived<int> > *>(?derived)->Self();
- то все должно быть ок я так понимаю?

Да, думаю, так срезки не будет.

Но дело в том, что тебе не должен быть нужным static_cast. Понижение по иерархии в С++ допускается.
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687081
батрак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасиб ЗАЧОТ. Вижу в полиморфизме ты разобрался ..
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687105
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
батракСпасиб ЗАЧОТ. Вижу в полиморфизме ты разобрался ..

Аж засмущался. Вижу ты теперь тоже.

Если не секрет для чего такая конструкция? Не встречал для чего это можно было бы применить:
Код: plaintext
1.
template <class T> class Derived :public Base<Derived<T> >
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687136
батрак
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh батракСпасиб ЗАЧОТ. Вижу в полиморфизме ты разобрался ..

Аж засмущался. Вижу ты теперь тоже.

Если не секрет для чего такая конструкция? Не встречал для чего это можно было бы применить:
Код: plaintext
1.
template <class T> class Derived :public Base<Derived<T> >


Читаю Страуструпа Языкпрограммирования С++ стр 396 гл.13.6 Наследование и шаблоны.
Преимущества такого наследования шаблонных классов я еще не осознал - вот и разбираюсь.
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687554
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
батракПреимущества такого наследования шаблонных классов я еще не осознал - вот и разбираюсь.Осознать преимущество сложно... Намного проще осознать недостатки.
Слишком большое количество вложенностей постоянно открыто в исходном тексте, слишком много букв надо писать чтобы объявить переменную и слишком сложно будет расширять всю эту гирлянду шаблонов если понадобиться.
Шаблоны на мой взгляд вообще совершенно лишняя вещь в языке... еще и наследовать их?
...
Рейтинг: 0 / 0
Правильно ли это?
    #34687849
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Факт в том, что здесь наследник от базового класса, который имеет наследника как шаблонный аргумент.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Правильно ли это?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]