Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Листинг 14.10. Указатели на функции-члены
1: //Листинг 14.10. Указатели на виртуальные функции-члены 2: 3: #include < iostream.h> 4: 5: class Mammal 6: { 7: public: 8: Mammal(): itsAge(1) { } 9: virtual ~Mammal() { } 10: virtual void Speak() const = 0; 11: virtual void Move() const = 0; 12: protected: 13: int itsAge; 14: }; 15: 16: class Dog: public Mammal 17: { 18: public: 19: void Speak()const { cout < < " Woof! \n"; } 20: void Move() const { cout < < " Walking to heel...\n"; } 21: }; 22: 23: 24: class Cat: public Mammal 25: { 26: public: 27: void Speak()const { cout < < " Meow! \n"; } 28: void Move() const { cout < < " slinking...\n"; } 29: }; 30: 31: 32: class Horse: public Mammal 33: { 34: public: 35: void Speak()const { cout < < " Whinny! \n"; } 36: void Move() const 1 cout < < " Galloping...\n"; } 37: }; 38: 39: 40: int main() 41: { 42: void (Mammal:: *pFunc)() const =0; 43: Mammal* ptr =0; 44: int Animal; 45: int Method; 46: bool fQuit = false; 47: 48: while (fQuit == false) 49: { 50: cout < < " (0)Quit (1)dog (2)cat (3)horse 51: cin > > Animal; 52: switch (Animal) 53: { 54: case 1: ptr = new Dog; break; 55: case 2: ptr = new Cat; break; 56: case 3: ptr = new Horse; break; 57: default: fQuit = true; break; 58: } 59: if (fQuit) 60: break; 61: 62: cout < < " (1)Speak (2)Move: "; 63: cin > > Method; 64: switch (Method) 65: { 66: case 1: pFunc = Mammal:: Speak; break; 67: default: pFunc = Mammal:: Move; break; 68: } 69: 70: (ptr-> *pFunc)(); 71: delete ptr; 72: } 73: return 0; 74: }
Результат: (0)Quit (1)dog (2)cat (3)horse: 1 (1)Speak (2)Move: 1 Woof! (0)Quit (1)dog (2)cat (3)horse: 2 (1)Speak (2)Move: 1 Meow! (0)Quit (1)dog (2)cat (3)horse: 3 (1)Speak (2)Move: 2 Galloping (0)Quit (1)dog (2)cat (3)horse: 0
Анализ: В строках 4—14 объявляется тип абстрактных данных Mammal с двумя чистыми виртуальными методами Speak() и Move(). От класса Mammal производятся подклассы Dog, Cat и Horse, в каждом из которых замещаются соответствующим образом функции Speak() и Move(). В процессе выполнения тела функции main() пользователю предлагается выбрать животное, после чего в области динамического обмена создается новый подкласс выбранного животного, адрес которого присваивается в строках 54—56 указателю ptr. Затем пользователь выбирает метод, который связывается с указателем pFunc. В строке 70 выбранный метод вызывается для созданного объекта посредством предоставления доступа к объекту с помощью указателя ptr и к функции с помощью указателя pFunc. Наконец, строкой 71 для указателя ptr вызывается функция delete, которая очищает область памяти, занятую созданным ранее объектом. Заметьте, что нет смысла вызывать delete для pFunc, поскольку последний является указателем на код, а не на объект в области памяти. Хотя даже при попытке сделать это вы получите сообщение об ошибке компиляции.
|