HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 18.02.2021, 03:07
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

Часто возникает задача когда нужно создать несколько классов, у которых будут одинаковые названия методов, но разная их реализация, а потом работать с ними так, будто это один класс. Очевидным решением в такой ситуации становятся шаблоны:

C++:





[CODE]
class
A
{
public
:
int
get
(
)
{
return
0
;
}
}
;
class
B
{
public
:
int
get
(
)
{
return
1
;
}
}
;
template

class
C
{
public
:
T obj
;
void
main
(
)
{
std
::
cout



Но допустим, тип поля obj должен определяться условно и не просто во время работы программы, а уже после создания экземпляра класса C без его разрушения, кол-во возможных типов при этом может быть ограничено. Сейчас приходится нагромождать кучу костылей: сначала создавать enum ClassType с названиями всех типов, потом в классе C создавать поле для каждого типа (A objA, B obj B), а потом в каждой функции мучиться с оператором switch(ClassType) — это неудобно и выглядит отвратительно. Потребность ведь совсем ненадуманная, она может возникнуть в любой большой программе. Как в таком случае организуют код опытные разработчики?
 
Ответить с цитированием

  #2  
Старый 18.02.2021, 14:16
memir
Постоянный
Регистрация: 21.08.2015
Сообщений: 343
С нами: 5646349

Репутация: 163
По умолчанию

Наследуйся от общего класса с виртуальным методом get() и переопределяй в дочерних. А поле делай как unique_ptr на базовый класс
 
Ответить с цитированием

  #3  
Старый 18.02.2021, 21:27
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

Цитата:
Сообщение от memir  

Наследуйся от общего класса с виртуальным методом get() и переопределяй в дочерних. А поле делай как unique_ptr на базовый класс
Тогда ведь будут вызываться методы get() базового класса, разве нет?
 
Ответить с цитированием

  #4  
Старый 18.02.2021, 21:53
memir
Постоянный
Регистрация: 21.08.2015
Сообщений: 343
С нами: 5646349

Репутация: 163
По умолчанию

Цитата:
Сообщение от Ya Zaregalsya  

Тогда ведь будут вызываться методы get() базового класса, разве нет?
нет, при вызове виртуального метода по ссылке или указателю срабатывает динамический полиморфизм и вызовется реализация метода для дочернего класса
 
Ответить с цитированием

  #5  
Старый 19.02.2021, 00:30
Ya Zaregalsya
Постоянный
Регистрация: 29.05.2017
Сообщений: 394
С нами: 4714653

Репутация: 98
По умолчанию

Цитата:
Сообщение от memir  

виртуальногометода
Вот оно!
 
Ответить с цитированием
Ответ



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.