Виртуални функции
|
|
- Koyna Gergova
- преди 4 години
- Прегледи:
Препис
1 Виртуални функции
2 Статично свързване Как компилаторът избира кой метод или коя функция да бъде извикана? Прави се сравнение между формални и фактически параметри и се избира най-точното съвпадение в случай, че има няколко най-точни, грешка за двусмислица Важно: Методът, който ще се извика се предопределя по време на компилация и при всяко изпълнение е един и същ
3 Статично свързване Пример: Person* pp = new Student( Иван, 123, 40000, 5); Кой метод ще извика pp->print()? Student::print или Person::print? подсказка: кое от двете може да се определи със сигурност по време на компилация, а не по време на изпълнение? Свързването по време на компилация нариаме статично или ранно (early binding) В C++ по подразбиране свързването е статично има езици, в които по подразбиране не е статично!
4 Защо само статично свързване не стига Пример: Person* pp = NULL; char c; cin >> c; if (c == 's') pp = new Student; if (c == 'e') pp = new Employee;... if (pp!= NULL) pp->print(); // Person::print Няма как компилаторът да знае какво ще въведе потребителят, затова се залага на сигурното Как можем да направим така, че да се извика този метод, който трябва?
5 Защо само статично свързване не стига Решение 1: Person* pp = NULL; char c; cin >> c; if (c == 's') pp = new Student; if (c == 'e') pp = new Employee;... if (pp!= NULL) { if (c == 's') ((Student*)pp)->print(); if (c == 'e') ((Employee*)pp)->print();
6 Защо само статично свързване не стига Решение 2: struct SmartPerson { Person* person; enum { PERSON, STUDENT, EMPLOYEE } type; void print() const { if (type == PERSON) person->print(); if (type == STUDENT) ((Student const*)person)->print(); if (type == EMPLOYEE) ((Employee const*)person)->print(); } }; SmartPerson pp = { NULL, PERSON }; char c; cin >> c; if (c == 's') { pp.person = new Student; pp.type = STUDENT; } if (c == 'e') { pp.person = new Employee; pp.type = EMPLOYEE; } pp.print();
7 Защо само статично свързване не стига И двете решения не са напълно добри, понеже изискват програмата да помни допълнителни неща... Колко хубаво би било, ако можеше със създаването си обектът да има етикет и по време на изпълнение етикетът се използва, за да се определи кой метод да се извика
8 Динамично свързване При динамичното (късно) свързване (late binding) методът, който ще се извика, се определя по време на изпълнение извиква се методът на този клас, от който всъщност е даденият обект независимо че указателят може да е дефиниран към базов клас
9 Виртуални член-функции В C++ динамичното свързване може да се включи за всяка отделна член-функция, като тя се обяви като виртуална virtual <сигнатура>; Класове с виртуални функции се наричат полиморфни Примери: class Person {... virtual void print() const;... }; Person p, *pp = &p; pp->print(); // Person::print() Student s; pp = &s; pp->print(); // Student::print() Employee e; pp = &e; pp->print(); // Employee::print()
10 Особености на виртуалните функции Само член-функции могат да бъдат виртуални Конструкторите не могат да са виртуални те се извикват преди обектът да е създаден Статичните член-функции не могат да са виртуални те могат да се извикват без обект Наследяващата член-функция в производния клас трябва да е със същата сигнатура ако сигнатурата е различна, това е друга функция наследяващите функции са автоматично виртуални и запазената дума virtual може да се пропусне virtual се пише само пред декларацията, не пред дефиницията
11 Видимост на виртуални функции Правило: Видимостта на една виртуална функция се определя от видимостта ѝ в класа на обекта, (указателя, псевдонима), през който се извиква Това означава ли, че: може private виртуална функция да се извика извън класа? няма смисъл виртуална функция в основния клас да е private или protected, понеже няма как да се извика? основният клас, който съдържа виртуалната функция, трябва да е наследен с public?
12 Извикване на виртуални функции Какво става ако виртуална функция, се извика: чрез обект Person p; p.print(); статично свързване, понеже типът се знае предварително чрез указател Person* pp = &s; pp->print(); динамично свързване чрез псевдоним Person& ap = e; ap.print(); еквивалентно на указател, динамично свързване чрез указване на област Person::print(); статично свързване, указали сме кой метод да се извика
13 Извикване на виртуални функции Какво става ако виртуална функция, се извика: от член-функция void Person::f() {... print();... } еквивалентно на извикване през this, динамично свързване! от конструктор на основен клас Person::Person() { print(); } статично свързване, обектът от производен клас още не е построен! от деструктор на основен клас Person::~Person() { print(); } статично свързване, обектът от производния клас вече е разрушен!
14 Косвено динамично свързване void Person::prettyPrint() const { cout << [ Person ] ; print(); cout << ; } Ако Student s; какво ще изведат: Person p = s; p.prettyprint(); Person* pp = &s; pp->prettyprint(); Person& ap = s; ap.prettyprint();
15 Косвено динамично свързване void Person::prettyPrint() const { cout << [ Person ] ; print(); cout << ; } Ако Student s; какво ще изведат: Person p = s; p.prettyprint(); Person* pp = &s; pp->prettyprint(); Person& ap = s; ap.prettyprint(); Извод: Виртуалността автоматично се разпростира и сред член-функциите, които извикват виртуални член-функции!
16 Коя реална функция ще се извика? Не е задължително виртуална функция да има нова реализация във всеки производен клас Избира се виртуалната функция, която е най-близко до класа, от който е обекта final overrider търси се отдолу-нагоре При множествено наследяване могат да се получат двусмислици ако Intern не дефинираше print(), какво щеше да изведе следният код? Intern i; Person* pp = &i; pp->print(); двусмислицата се вижда още по време на компилация!
17 Механизъм на виртуалните таблици Как програмата решава по време на изпълнение кой метод да се изпълни? За всеки клас с виртуални функции се създава таблица с указатели към тях (виртуална таблица) За всеки обект с виртуални функции в началото се поставя указател към виртуална таблица При динамично свързване, се случва следното: компилаторът изчислява номера i на извикваната виртуалната функция компилаторът генерира код, който намира i-тия указател във виртуалната таблица на обекта извиква функцията, която се сочи от този указател
18 Механизъм на виртуалните таблици Employee Employee::Employee Employee::setPosition Employee::print Employee::getPosition Person Person::Person Person::setName Person::print Person::getID Student Student::Student Student::setGrade Student::print Student::getFN Employee VTable Person VTable Student VTable Person vptr name id Employee Person vptr name id position salary
19 Виртуални таблици и множествено наследяване При множествено наследяване се създава по една виртуална таблица за всеки основен клас Във всеки обект има по един указател към виртуална таблица за всеки основен клас Ако имаме и виртуално наследяване, представянето става още по-сложно За щастие, в рамките на този курс няма да пишем компилатор за C++
20 Типова информация по време на изпълнение (RTTI) В C++ има механизъм за намиране на типа на даден обект по време на изпълнение typeid(<израз>) връща обект от тип type_info ако <израз> е lvalue от полиморфен клас, връща динамичния тип на <израз> иначе, връща статичния тип на <израз> можете да получите името на даден тип cout << typeid(pp).name() << ' ' << typeid(*pp).name(); два типа могат да се сравняват с == или!= typeid(p)!= typeid(s), typeid(*pp) == typeid(student)
21 Виртуални деструктори Person* pp = new Employee;... delete pp; Кой деструктор ще се извика?
22 Виртуални деструктори Person* pp = new Employee;... delete pp; Кой деструктор ще се извика? статично свързване, деструкторът на Person динамичната памет на Employee остава неосвободена (изтичане на памет)! Искаме да се вика правилният деструктор! Можем да декларираме деструктора като виртуален Тогава свързването е динамично и ще се извика деструкторът на Employee
Lush Green
Класове Какво са класовете? Основен инструмент на ООП Средство за дефиниране на абстрактни типове данни Синтактична конструкция, която позволява логическо групиране на данни и операциите над тях Дефиниция
ПодробноLush Green
Конструктори Жизнен цикъл на обект За обекта се заделя памет и се свързва с неговото име Извиква се подходящ конструктор на обекта... (достъп до компоненти на обект, изпълняване на операции) Достига се
Подробно2. Наследяване в C++ Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 1 февруари 2007 г. 1 Наследяване 1 2
2. Съдържание Съдържание Наследяване (Rev: 1.2) Любомир Чорбаджиев 1 lchorbadjiev@elsys-bg.org 1 февруари 2007 г. 1 Наследяване 1 2 2 3 Полиморфизъм 9 1. Наследяване Наследяване UML UML unified modeling
ПодробноДинамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София
Динамична памет. Конструктори и деструктори Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision : 1.3 16 ноември 2004 г. Пример:
Подробно4
Наследяване и 4 Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 11 май 2017 г. Трифон Трифонов (ООП 16/17) Наследяване и голямата
ПодробноПредефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически униве
Предефиниране на оператори. Копиращ конструктор. Оператор за присвояване Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision :
ПодробноДинамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Тр
Динамична памет Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 21 декември 2016 г. Трифон Трифонов (УП 16/17) Динамична памет 21 декември
ПодробноДефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София
Дефиниране на шаблон Шаблони (Templates) Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision : 1.1 9 март 2005 г. template< class
ПодробноОбработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София Re
Обработка на грешки Изключения Любомир Чорбаджиев Технологическо училище Електронни системи Технически университет, София lchorbadjiev@elsys-bg.org Revision : 1.1 27 февруари 2005 г. 1 #include < cstdio
ПодробноBlack and White
Advanced C++ Memory Management Йордан Димитър Зайков Трендафилов Memory Management Effective C++ 2 nd ed: 3, 5, 7, 8, 9, 10 More Effective C++: 1, 3, 8 Exceptional C++: 35, 36 Какво всъщност прави new?
ПодробноКласове в C++ (Rev: 742) Любомир Чорбаджиев 1 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1
Класове в C++ (Rev: 742) Любомир Чорбаджиев 1 lchorbadjiev@elsys-bg.org 20 октомври 2006 г. Съдържание Съдържание 1 Обектно-ориентирано програмиране 1 1.1 Модулност............................ 1 1.2 Обектно-ориентирана
ПодробноКанонична форма на клас или 4 (голямата четворка) Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно и
Канонична форма на клас или 4 (голямата четворка) Трифон Трифонов Обектно-ориентирано програмиране, спец. Компютърни науки, 1 поток, спец. Софтуерно инженерство, 2016/17 г. 6 април 2017 г. Трифон Трифонов
ПодробноСтруктура на програма в C - Част 7 - масиви, оператор за индексиране, sizeof оператор
Структура на програма в C Част 7 - масиви, оператор за индексиране, sizeof оператор Иван Георгиев, Христо Иванов, Христо Стефанов Технологично училище "Електронни системи", Технически университет, София
ПодробноC++
Управляващи оператори в C++ Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 18 30 октомври 2018 г. Трифон Трифонов (УП 18/19) Управляващи оператори в C++ 18 30 октомври
ПодробноСинтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/
Синтаксис за дефиниране на функции Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 6 януари 2016 г. Трифон Трифонов (ФП-И 15/16) Синтаксис за дефиниране на функции 6 януари 2016
ПодробноИНТЕРНЕТ ПРОГРАМИРАНЕ - JAVA JAVA ОБЕКТИ Ненко Табаков Пламен Танов Технологическо училище Електронни системи Технически университет София 9 октомври
JAVA ОБЕКТИ Ненко Табаков Пламен Танов Технологическо училище Електронни системи Технически университет София 9 октомври 2008 JAVA ОБЕКТИ Забележка: Тази лекция е адаптация на лекция от курса: 6.092 Java
ПодробноСтруктура на програма в C - Част 6 - goto, switch, break и continue клаузи
Структура на програма в C Част 6 - goto, switch, break и continue клаузи Иван Георгиев, Христо Иванов, Христо Стефанов Технологично училище "Електронни системи", Технически университет, София 21 април
ПодробноУказатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23
Указатели. Маисиви, указатели, параметри на функции Калин Георгиев 21 декември 2016 г. Калин Георгиев Увод в програмирането 21 декември 2016 г. 1 / 23 Указатели! Калин Георгиев Увод в програмирането 21
Подробно-
Лениво оценяване и програмиране от по-висок ред Трифон Трифонов Функционално програмиране, спец. Информатика, 2015/16 г. 7 януари 2016 г. Трифон Трифонов (ФП-И 15/16) Лениво оценяване 7 януари 2016 г.
ПодробноПрограмиране на Паскал
Поради връзката на С++ с езика С в голяма част от литературата е прието записването С/С++. Това е найизползваният език за програмиране в света, поради което синтаксисът на някои от по-новите езици като
ПодробноСЪЗДАВАНЕ НА СЪДЪРЖАНИЕ, ИНДЕКСЕН УКАЗАТЕЛ И ВМЪКВАНЕ НА ПОЛЕТА I. СЪЗДАВАНЕ НА СЪДЪРЖАНИЕ Съдържанието се създава по съществуващ в Word форматен стил
СЪЗДАВАНЕ НА СЪДЪРЖАНИЕ, ИНДЕКСЕН УКАЗАТЕЛ И ВМЪКВАНЕ НА ПОЛЕТА I. СЪЗДАВАНЕ НА СЪДЪРЖАНИЕ Съдържанието се създава по съществуващ в Word форматен стил или по създаден от вас потребителски стил. По подразбиране
ПодробноПри изпълнението на програма се извършват определени действия над данните, дефинирани в програмата.тези данни могат да бъдат постоянни ( константи ) и
При изпълнението на програма се извършват определени действия над данните, дефинирани в програмата.тези данни могат да бъдат постоянни ( константи ) или изменящи се (променливи). Тези данни най-често бива
ПодробноMicrosoft Word - VM22 SEC55.doc
Лекция 5 5 Диференциални уравнения от първи ред Основни определения Диференциално уравнение се нарича уравнение в което участват известен брой производни на търсената функция В общия случай ( n) диференциалното
Подробно3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението
3. Синтактичен анализ. Граматика на учебен програмен език STUDENT. Извеждане на изречения от правилата на граматиката Цел на упражнението Упражнението представя кратко въведение в синтактичния анализ.
ПодробноСериализация Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23
Калин Георгиев 13 май 2016 г. Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 1 / 23 f «data; f» data; Калин Георгиев Обектно ориентирано програмиране 13 май 2016 г. 2 / 23 Първо изискване:
Подробно2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнениет
2. Лексически анализ. Основни понятия и алгоритъм на лексическия анализ. Програмна структура на лексическия анализатор Цел на упражнението Упражнението представя кратко въведение в теорията на лексическия
ПодробноMicrosoft Word - PRMAT sec99.doc
Лекция 9 9 Изследване на функция Растене, намаляване и екстремуми В тази лекция ще изследваме особеностите на релефа на графиката на дадена функция в зависимост от поведението на нейната производна Основните
ПодробноMathematica CalcCenter
Mathematica CalcCenter Основни възможности Wolfram Mathematica CalcCenter е разработен на базата на Mathematica Professional и първоначално е бил предназначен за технически пресмятания. Информация за този
ПодробноМасиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 1
Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 ноември 6 декември 2018 г. Трифон Трифонов (УП 18/19) Масиви и низове 15.11-6.12.2018 г. 1 / 17 Масиви
ПодробноСтруктура на програма в C - Част 2 - типове, функции
Структура на програма в C Част 2 - типове, функции Иван Георгиев, Христо Иванов, Христо Стефанов Технологично училище "Електронни системи", Технически университет, София 10 март 2019 г. И. Георгиев, Х.
ПодробноМасиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г ноември 2018 г. Трифон Трифонов (УП 18/19) Ма
Масиви и низове Трифон Трифонов Увод в програмирането, спец. Компютърни науки, 1 поток, 2018/19 г. 15 29 ноември 2018 г. Трифон Трифонов (УП 18/19) Масиви и низове 15 29 ноември 2018 г. 1 / 16 Масиви Логическо
ПодробноПРОГРАМНО ОСИГУРЯВАНЕ НА КОМПЮТЪРА
СРЕДИ ЗА ПРОГРАМИРАНЕ ПРОГРАМНО ОСИГУРЯВАНЕ НА КОМПЮТЪРА Същност на програмното осигуряване За да могат компютрите да разбират описаните на езика за програмиране алгоритми, те трябва да бъдат преведени
ПодробноМИНИСТЕРСТВО НА ОБРАЗОВАНИЕТО И НАУКАТА
МИНИСТЕРСТВО НА ОБРАЗОВАНИЕТО И НАУКАТА У Ч Е Б Н А П Р О Г Р А М А ЗА ЗАДЪЛЖИТЕЛНА ПРОФЕСИОНАЛНА ПОДГОТОВКА ПО ПРОГРАМИРАНЕ И АЛГОРИТМИЧНИ ЕЗИЦИ ЗА ПРОФЕСИЯ: КОД 482010 ИКОНОМИСТ - ИНФОРМАТИК СПЕЦИАЛНОСТ:
Подробноdoll Механична кукла Механичните кукли автоматично повтарят предварително зададена последователност от движения. В Япония има традиции в изработката н
doll Механична кукла Механичните кукли автоматично повтарят предварително зададена последователност от движения. В Япония има традиции в изработката на механични кукли, датиращи от древни времена. Движенията
ПодробноПроф
Утвърдил:.. / доц. д-р Е. Великова / Утвърден от Факултетен съвет с протокол... /... СОФИЙСКИ УНИВЕРСИТЕТ СВ. КЛИМЕНТ ОХРИДСКИ Факултет по Математика и Информатика Специалност: Компютърни науки М И К 0
ПодробноСтруктура на програма в C - Част 9 - низове от символи, C-string
Структура на програма в C Част 9 - низове от символи, C-string Иван Георгиев, Христо Иванов, Христо Стефанов Технологично училище "Електронни системи", Технически университет, София 15 май 2019 г. И. Георгиев,
ПодробноMicrosoft Word - Glava24.doc
2.4. Въведение в езика OQL Обектно ориентираният език на заявките OQL е един опит да се стандартизират обектноориентираните езици на заявките във форма на език, обединяващ в себе си декларативното SQL
ПодробноПроект 1: Форма за решаване на тест Създайте приложение, което тества знанията на ученика по Информатика. Върху формата да се разположат въпроси с по
Проект 1: Форма за решаване на тест Създайте приложение, което тества знанията на ученика по Информатика. Върху формата да се разположат въпроси с по четири отговора всеки, от които точно един е верен.
ПодробноЕКСПЛОДИРАЩИ ТОЧКИ ГЛАВА 1 МАШИНИ Добре дошли на борда на нашето приключение. Това е математическо приключение базирано върху една моя история (аз съм
ЕКСПЛОДИРАЩИ ТОЧКИ ГЛАВА 1 МАШИНИ Добре дошли на борда на нашето приключение. Това е математическо приключение базирано върху една моя история (аз съм Джеймс), която не е истинска. Когато бях дете, аз
ПодробноSlide 1
Списъци. Структура и синтаксис. Създаване и показване. Основни операции(добавяне, изваждане на елемент или цял подсписък; подреждане). Трансформации. проф. дмн С. Христова Списъци Списъците / list са основна
ПодробноВ тази част, ще разгледаме аритметичните и логически операции, както, и включването им в изрази. В следващата таблица са дадени всички възможни операц
В тази част, ще разгледаме аритметичните и логически операции, както, и включването им в изрази. В следващата таблица са дадени всички възможни операции в езикът C и С++. Символ Предназначение Аритметични
ПодробноHTML - списъци
СПИСЪЦИ Езикът HTML ви дава възможност да използвате три вида списъци - подредени, неподредени и списъци с обяснения. Подредените списъци са номерирани и изглеждат така : 1. Иван 2. Георги 3. Захари Неподредените
ПодробноMicrosoft Word - Primer3_1.doc
3.1.) Създаване на нов проект demultiplexor и нов файл demultiplexor.vhd в текстовия редактор Galaxy Стартирайте текстовия редактор Galaxy, използвайки опциите : Start > Programs > WARP > Galaxy 3.1.1.
Подробно