Студопедия

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

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

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






  • Листинг 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.

     






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