Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 11.10. Дробление объекта при передаче его как значения
1: //Листинг 11.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 { cout < < " Mammal speak! \n"; } 11: protected: 12: int itsAge; 13: }; 14: 15: class Dog: public Mammal 16: { 17: public: 18: void Speak()const { cout < < " Woof! \n"; } 19: }; 20: 21: class Cat: public Mammal 22: { 23: public: 24: void Speak()const { cout < < " Meow! \ri"; > 25: }; 26: 27: void ValueFunction (Mammal); 28: void PtrFunction (Mammal*); 29: void RefFunction (Mammal&); 30: int main() 31: { 32: Mammal* ptr=0; 33: int choice; 34: while (1) 35: { 36: bool fQuit = false; 37: cout < < " (1)dog (2)cat (0)Quit: "; 38: cin > > choice; 39: switch (choice) 40: { 41: case 0: fQuit = true; 42: break; 43: case 1: ptr = new Dog; 44: break; 45: case 2: ptr = new Cat; 46: break; 47: default: ptr = new Mammal; 48: break; 49: } 50: if (fQuit) 51: break; 52: PtrFunction(ptr); 53: RefFunction(*ptr); 54: ValueFunction(*ptr); 55: } 56: return 0; 57: } 58: 59: void ValueFunction (Mammal MammalValue) 60: { 61: MammalValue.Speak(); 62: } 63: 64: void PtrFunction (Mammal * pMammal) 65: { 66: pMammal-> Speak(); 67: } 68: 69: void RefFunction (Mammal & rMammal) 70: { 71: rMammal.Speak(); 72: }
Результат: (1)dog (2)cat (0)Quit: 1 Woof Woof Mammal Speak! (1)dog (2)cat (0)Quit: 2 Meow! Meow! Mammal Speak! (1)dog (2)cat (0)Quit: 0
Анализ: В строках 5—25 определяются классы Mammal, Dog и Cat. Затем объявляются три функции — PtrFunction(), RefFunction() и ValueFunction(). Они принимают соответственно указатель класса Mammal, ссылку класса Mammal и объект класса Mammal. После чего выполняют одну и ту же операцию — вызывают метод Speak(). Пользователю предлагается выбрать объект класса Dog или класса Cat, после чего в строках 43—46 создается указатель соответствующего типа. Судя по информации, выведенной программой на экран, пользователь первый раз выбрал объект класса Dog, который был создан в свободной области памяти 43-й строкой программы. Затем объект класса Dog передается в три функции с помощью указателя, с помощью ссылки и как значение. В том случае, когда в функцию передавался адрес объекта с помощью указателя или ссылки, успешно выполнялась функция-член Dog-> Speak(). На экране компьютера дважды появилось сообщение, соответствующее выбранному пользователем объекту. Разыменованный указатель передает объект как значение. В этом случае функция распознает принадлежность переданного объекта классу Mammal, компилятор разбивает объект класса Dog пополам и использует только ту часть, которая была создана конструктором класса Mammal. В таком случае вызывается версия метода Speak(), которая была объявлена для класса Mammal, что и отобразилось в информации, выведенной программой на экран. Те же действия и с тем же результатом были выполнены затем и для объекта класса Cat.
|