Студопедия

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

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

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






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Листинг 11.11. Виртуальный конструктор-копировщик






    1: //Листинг 11.11. Виртуальный конструктор-копировщик

    2:

    3: #include < iostream.h>

    4:

    5: class Mammal

    6: {

    7: public:

    8: Mammal(): itsAge(1) { cout < < " Mammal constructor...\n"; }

    9: virtual ^Mammal() { cout < < " Mammal destructor...\n"; }

    10: Mammal (const Mammal & rhs);

    11: virtual void Speak() const { cout < < " Mammal speak! \n"; }

    12: virtual Mammal* Clone() { return new Mammal(*this); }

    13: int GetAge()const { return itsAge; }

    14: protected:

    15: int itsAge;

    16: };

    17:

    18: Mammal:: Mammal (const Mammal & rhs): itsAge(rhs.GetAge())

    19: {

    20: cout < < " Mammal Copy Constructor...\n";

    21: }

    22:

    23: class Dog: public Mammal

    24: {

    25: public:

    26: Dog() { cout < < " Dog constructor...\n"; }

    27: virtual ~Dog() { cout < < " Dog destructor...\n"; }

    28: Dog (const Dog & rhs);

    29: void Speak()const { cout < < " Woof! \n"; }

    30: virtual Mammal* Clone() { return new Dog(*this); }

    31: };

    32:

    33: Dog:: Dog(const Dog & rhs):

    34: Mammal(rhs)

    35: {

    36: cout < < " Dog copy constructor...\n";

    37: }

    38:

    39: class Cat: public Mammal

    40: {

    41: public:

    42: Cat() { cout < < " Cat constructor,,, \n"; }

    43: ~Cat() { cout < < " Cat destructor...\n"; }

    44: Cat (const Cat &);

    45: void Speak()const { cout < < " Meow! \n"; }

    46: virtual Mammal* Clone() { return new Cat(*this); }

    47: };

    48:

    49: Cat:: Cat(const Cat & rhs):

    50: Mammal(rhs)

    51: {

    52: cout < < " Cat copy constructor.., \n";

    53: }

    54:

    55: enum ANIMALS { MAMMAL, D0G, CAT };

    56: const int NumAnimalTypes = 3;

    57: int main()

    58: {

    59: Mammal *theArray[NumAnimalTypes];

    60: Mammal* ptr;

    61: int choice, i;

    62: for (i = 0; i< NumAnimalTypes; i++)

    63: {

    64: cout < < " (1)dog (2)cat (3)Mammal: ";

    65: cin > > choice;

    66: switch (choice)

    67: {

    68: case DOG: ptr = new Dog;

    69: break;

    70: case CAT: ptr = new Cat;

    71: break;

    72: default: ptr = new Mammal;

    73: break;

    74: }

    75: theArray[i] = ptr;

    76: }

    77: Mammal *OtherArray[NumAnimalTypes];

    78: for (i=0; i< NumAnimalTypes; i++)

    79: {

    80: theArray[i]-> Speak();

    81: OtherArray[i] = theArray[i]-> Clone();

    82: }

    83: for (i=0; i< NumAnimalTypes; i++)

    84: OtherArray[i]-> Speak();

    85: return 0;

    86: }

     

    Результат:

    1: (1)dog (2)cat (3)Mammal: 1

    2: Mammal constructor...

    3: Dog constructor...

    4: (1)dog (2)cat (3)Mammal: 2

    5: Mammal constructor...

    6: Cat constructor...

    7: (1)dog (2)cat (3)Mammal: 3

    8: Mammal constructor...

    9: Woof!

    10: Mammal Copy Constructor...

    11: Dog copy constructor...

    12: Meow!

    13: Mammal Copy Constructor...

    14: Cat copy constructor...

    15: Mammal speak!

    16: Mammal Copy Constructor...

    17: Woof!

    18: Meow!

    19: Mammal speak!

     

    Анализ: Листинг 11.11 похож на два предыдущих листинга, однако в данной программе в классе Mammal добавлен один новый виртуальный метод — Clone(). Этот метод возвращает указатель на новый объект класса Mammal, используя конструктор-копировщик, параметр которого представлен указателем < < this.

    Метод Clone() замещается в обоих производных классах — Dog и Cat — соответствующими версиями, после чего копии данных передаются на конструкторы- копировщики производных классов. Поскольку Clone() является виртуальной функцией, то в результате будут созданы виртуальные конструкторы-копировщики, как показано в строке 81.

    Пользователю предлагается выбрать объект класса 0og, Cat или Mammal. Объект выбранного типа создается в строках 62-74. В строке 75 указатель на новый объект добавляется в массив данных.

    Затем осуществляется цикл, в котором для каждого объекта массива вызываются методы Speak() и Clone() (см. строки 80 и 81). В результате выполнения функции возвращается указатель на копию объекта, которая сохраняется в строке 81 во втором массиве.

    В строке 1 вывода на экран показан выбор пользователем опции 1 — создание объекта класса Dog. В создание этого объекта вовлекаются конструкторы базового и производного классов. Эта операция повторяется для объектов классов Cat и Mammal в строках вывода 4-8.

    В строке 9 вывода показано выполнение метода Speak() для объекта класса Dog. Поскольку функция Speak() также объявлена как виртуальная, то при обращении к ней вызывается та ее версия, которая соответствует типу объекта. Затем следует обращение еще к одной виртуальной функции Clone(), виртуальность которой проявляется в том, что при вызове из объекта класса Dog запускаются конструктор класса Mammal и конструктор-копировщик класса Dog.

    То же самое повторяется для объекта класса Cat (строки вывода с 12—14) и объекта класса Mammal (строки вывода 15 и 16). В результате создается массив объектов, для каждого из которых вызывается своя версия функции Speak().

     






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