Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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, поскольку последний является указателем на код, а не на объект в области памяти. Хотя даже при попытке сделать это вы получите сообщение об ошибке компиляции.
|