Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 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, поскольку последний является указателем на код, а не на объект в области памяти. Хотя даже при попытке сделать это вы получите сообщение об ошибке компиляции.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.