Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Компилятор https://www.cyberforum.ru/ cpp/ thread193991.html
Здравствуйте. Пишу компилятор pas->asm на с++ Может кто-то подскажет генератор конструкцый или что-то подобное: <переменная1>+<переменная2> mov...
C или C++(не холивар) C++
Здравствуйте. Участвую в различных олимпиадах по программированию, пишу обычно на C++, используя все его вкусности в виде STL, ООП, темплэйтов и проч. Накануне в двух задачах не уложился в...
x86 интерпретатор исходный код C++
кто-нибудь слышал про интерпретаторы x86? в инете нарыл только что в qemu, bochs есть встроенные интерпретаторы команд x86 процессора, но пока не докопался до них. Нужно самому написать такой...
C++ Крестики Нолики учу си месяц дали задачу... хелп ми плиз! Игра крестики нолики. Игра в крестики нолики вдется на квадратном поле 3*3. Играют двое. Начинают крестики. каждый из игроков, поочередно, ставит свой... https://www.cyberforum.ru/ cpp/ thread193237.html
C++ Алгоритмы и программы по использованию указателей и динамических структур данных https://www.cyberforum.ru/ cpp/ thread193137.html
Здравствуйте! Помогите, пожалуйста, написать задачу. Вот текст:Дан указатель P0 на один из элементов непустого двусвязного списка. Вывести число N — количество элементов в списке, а также указатели...
Функция rand C++
Решить задачу с использованием библиотечной функции rand,заголовочный файл stdlib.h Случайные числа в диапазоне от -32768 до 32768 можно получить с помощью следуйщей фунции int casual () { ...
C++ callback метода класса
Предыстория: нужно последовательно запускать несколько однотипных циклов большой степени вложенности, в теле которых вызывать разные функции. Т.к. вроде бы переписывать циклы (тем более громоздкие...
C++ кривой Безье написать проектную процедуру создания кривой Безье, Желательно в С++ Добавлено через 17 часов 16 минут помогайте срочно надо(( я не знаю как сделать .... ил дайте ссылку на информацию как ее... https://www.cyberforum.ru/ cpp/ thread192259.html
C++ Выявление такого же ай-пи/мак адреса https://www.cyberforum.ru/ cpp/ thread191681.html
Усем здрасти!) имеется необходимость написать приложение, которое, бы присваивало ip адрес сетевой карте и менять ее мак-адресс. Но самое интересное, что приложение должно извещать пользователя о...
C++ КНИГИ Подскажите харошую(лучшую) книгу по С++ ИЛИ Visual C++ Добавлено через 2 часа 45 минут Посрветуйте https://www.cyberforum.ru/ cpp/ thread191642.html
Evg
Эксперт CАвтор FAQ
21115 / 8131 / 628
Регистрация: 30.03.2009
Сообщений: 22,447
Записей в блоге: 30
0

Использование указателя на метод вместо виртуального метода

20.11.2010, 12:33. Просмотров 5280. Ответов 45
Метки (Все метки)

Имеется базовый класс Base. Имеется производный от Base класс Derived. В классе Derived требуется выполнить некоторое действие, которое практически полностью эквивалентно для любого производного от Base класса, за исключением небольшого фрагмента.

Схематично код выглядит так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Base
{
  void Exec (void)
  {
    // общие действия
    ...
 
    // конкретные действия для производных классов
    Tail ();
  }
 
  virtual void Tail (void) = 0;
};
 
class Derived : public Base
{
  void MyExec (void)
  {
    // В процессе исполнения будет исполнен виртуальный метод Tail
    Exec ();
  }
 
  virtual void Tail (void)
  {
    // Определяем конкретные действия для нашего класса
  }
}
Однако при такой схеме возможен только один вид частных действия для производного класса. А хотелось бы, чтобы внутри производного класса можно было выполнять разные действия. Для этого логично было бы использовать указатель на метод. Т.е. что-то типа такого

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Base
{
  void Exec (void (Base::*tail)(void))
  {
    // общие действия
    ...
 
    // конкретные действия для производных классов
    // здесь уже через указатель  на метод
    (this->*tail) ();
  }
};
 
class Derived : public Base
{
  void MyExec (void)
  {
    // Выполняем основные действия с двумя разными типами
    // частных действий. Необходимую операцию преобразования
    // указателя на метод опускаю, чтобы глаза не резало
    Exec (Tail1);
    Exec (Tail2);
  }
 
  void Tail1 (void)
  {
    // Определяем конкретные действия "вариант1" для нашего класса
  }
 
  void Tail2 (void)
  {
    // Определяем конкретные действия "вариант2" для нашего класса
  }
}
Собственно вопрос: насколько опасным является преобразование указателя на метод в данном случае. Опасность не столько в преобразовании указателя на метод, сколько в том, что при вызове Derived-метода через указатель на класс Base может прийти кривой this. Понятно, что в случае "простого" наследования ничего страшного нет. Будет ли что-то криво работать в случае множественных или виртуальных наследований или в каких-то ещё тяжёлых случаев. Или такой способ при некоторых ограничениях на тип наследования можно считать надёжным и корректным? Можно ли как-то сделать статический контроль в случаях, когда такой вариант оказывается некорректным?

Вернуться к обсуждению:
Использование указателя на метод вместо виртуального метода
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2010, 12:33
Готовые ответы и решения:

Вызов виртуального метода базового класса из указателя производного
Допустим есть такой код: #include &lt;iostream&gt; class Base { public: virtual void f() {...

Почему при переопределении виртуального метода в производном классе выводится метод базового?
Всем добра! Помогите разобраться почему при переопределении виртуального метода в производном...

Использовать метод transform() вместо метода sort()
Добрый день , надо исправить код , заменив метод sort() , методом transform(), не могу уловить...

Как сделать функцию от указателя на класс и указателя на метод?
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод....

45
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.