Відкритого успадкування


НазваВідкритого успадкування
Дата конвертації14.05.2013
Розмір445 b.
ТипПрезентации



Поліморфізм ― це центральна тема об'єктно-орієнтованого програмування, але стосується вона лише такого відкритого успадкування (public inheritance), при якому об'єкт похідного класу виявляється різновидом базового

  • Поліморфізм ― це центральна тема об'єктно-орієнтованого програмування, але стосується вона лише такого відкритого успадкування (public inheritance), при якому об'єкт похідного класу виявляється різновидом базового

  • Це значить, що до похідного класу можна звернутися за виконанням будь-якого методу, декларованого, але не обов'язково реалізованого, в базовому класі

  • З точки зору поліморфізму успадкування реалізації, яким служать закрите (private inheritance) і захищене успадкування (private inheritance) взагалі не розглядається і до успадкування не належить



Merriam-Webster's Online Dictionary

  • Merriam-Webster's Online Dictionary

  • polymorphism (1839) the quality or state of existing in or assuming different forms

  • Wikipedia, the Free Encyclopedia

  • polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface



Одна операція додавання (виводу) для різних типів даних

  • Одна операція додавання (виводу) для різних типів даних

  • const Complex i = {0, 1};

  • Complex z = {1, 1};

  • double x = 2, y=3;

  • cout << (x +5) + (z+i) + y<

  • Complex operator+ (const Complex &, const Complex &);

  • Complex operator+ (double, const Complex &);

  • Complex operator+ (const Complex &, double);

  • ostream& operator<<(ostream &os, const Complex &);



if ( (*pf)( left)*(*pf)(0.5*( left + right) <0)

  • if ( (*pf)( left)*(*pf)(0.5*( left + right) <0)

  • right = 0.5*( left + right);

  • const NonConstAction menuNonConst[] =

  • {

  • &Screen::home,

  • &Screen::move,

  • &Screen::back,

  • &Screen::clear

  • };

  • doActionNonConst(v, menuNonConst[k], n);



class European{

  • class European{

  • public:

  • string myNation() {

  • return “European”;

  • }

  • };

  • void talk(European & person)

  • {

  • cout<<“I am”<< person.myNation()<

  • }

  • // European



class Ukrainian: public European {

  • class Ukrainian: public European {

  • public:

  • string myNation() {

  • return “Ukrainian”;

  • }

  • };

  • Ukrainian me;

  • talk (me); // Ukrainian

  • European & someone (me);

  • talk (someone); // European



class European{

  • class European{

  • public:

  • virtual string myNation() {

  • return “European”;

  • }

  • };

  • Ukrainian me;

  • talk (me); // Ukrainian

  • European & someone (me);

  • talk (someone); // Ukrainian



Як зробити так, щоб базовий інтерфейс реагував на конкретний тип похідного об'єкту?

  • Як зробити так, щоб базовий інтерфейс реагував на конкретний тип похідного об'єкту?

  • Рішення

  • Через механізми функціональної полісемії (непрямий виклик)

  • Команда компілятору

  • Бери функцію talk() у тому об'єкті, який зараз фактично маєш



Братські класи: кожен похідний клас належить одному базовому типу:

  • Братські класи: кожен похідний клас належить одному базовому типу:

  • Гострокутний, прямокутний і тупокутний трикутники дають вичерпну класифікацію трикутників



В одному похідному класі об'єднуються декілька базових класів

  • В одному похідному класі об'єднуються декілька базових класів

  • «В одну телегу впрячь не можно

  • Коня и трепетную лань.»

  • О.С. Пушкін (1799—1837) «Полтава» (1829)



// Клас хижаків

  • // Клас хижаків

  • class Predator

  • {

  • private:

  • string _favoritePrey;

  • string _name;

  • public:

  • Predator(const string& prey, const string& name);

  • ~Predator();

  • void setFavotitePray (const string&);

  • const string& getFavotitePray() const;

  • void setName (const string&);

  • const string& getName() const;

  • };





// Клас кішок:

  • // Клас кішок:

  • // хижаки і кімнатні тварини одночасно

  • class Cat : public Predator, public Pet {

  • public:

  • Cat(const string& prey,

  • const string& toy,

  • const string& name );

  • ~Cat();

  • };







// Клас паралелограмів

  • // Клас паралелограмів

  • class Paralellogram

  • {

  • protected:

  • length_t _height;

  • length_t _width;

  • angle_t _angle;

  • public:

  • Paralellogram(length_t h, length_t w, length_t a):

  • _height (h), _width (w), _angle (a){};

  • };



// Клас прямокутників

  • // Клас прямокутників

  • class Rectangle : public Paralellogram {

  • public:

  • Rectangle(length_t h, length_t w):

  • Paralellogram (h, w, pi/2){};

  • };

  • // Клас ромбів

  • class Rhombus : public Paralellogram {

  • public:

  • Rhombus(length_t side, angle_t a):

  • Paralellogram (side, side, a){};

  • };



// Квадрат походить одночасно від

  • // Квадрат походить одночасно від

  • // прямокутника і ромба

  • class Square : public Rectangle, public Rhombus

  • {

  • public:

  • Square (length_t side ):

  • Rectangle( side, side ),

  • Rhombus (side, 90) {};

  • };





// Клас прямокутників

  • // Клас прямокутників

  • class Rectangle : virtual public Paralellogram {

  • public:

  • Rectangle(length_t h, length_t w):

  • Paralellogram (h, w, pi/2){};

  • };

  • // Клас ромбів

  • class Rhombus : virtual public Paralellogram {

  • public:

  • Rhombus(length_t side, angle_t a):

  • Paralellogram (side, side, a){};

  • };



// Квадрат походить одночасно від

  • // Квадрат походить одночасно від

  • // прямокутника і ромба

  • class Square : public Rectangle, public Rhombus

  • {

  • public:

  • Square (length_t side ):

  • Rectangle( side, side ),

  • Rhombus (side, 90),

  • Paralellogram (side, side, pi/2) {};

  • };





Звідки брати реалізацію: з базового класу чи похідного?

  • Звідки брати реалізацію: з базового класу чи похідного?

  • Виявляється, що коректніше використовувати абстрактні базові класи, вільні від реалізації

  • Реалізація може заважати: бути суперечливою, виключати можливі альтернативи

  • До того ж вона не всім потрібна



// Клас фігур невідомого типу

  • // Клас фігур невідомого типу

  • class Shape

  • {

  • public:

  • void whatAmI();

  • {

  • cout << "I don't know what I am!\n";

  • }

  • };



// Клас прямокутників

  • // Клас прямокутників

  • class Rectangle : public Shape

  • {

  • public:

  • void whatAmI()

  • {

  • cout << "I'm a rectangle!\n";

  • }

  • };



// Клас трикутників

  • // Клас трикутників

  • class Triangle : public Shape

  • {

  • public:

  • void whatAmI()

  • {

  • cout << "I'm a triangle!\n";

  • }

  • };



Shape *s1, *s2, *s3;

  • Shape *s1, *s2, *s3;

  • s1 = new Rectangle;

  • s2 = new Triangle;

  • s3 = new Shape;

  • s1->whatAmI();

  • s2->whatAmI();

  • s3->whatAmI();



// Клас фігур невідомого типу

  • // Клас фігур невідомого типу

  • class Shape

  • {

  • public:

  • virtual void whatAmI();

  • {

  • cout << "I don't know what I am!\n";

  • }

  • };



Shape *s = new Shape;

  • Shape *s = new Shape;



Shape *s = new Shape;

  • Shape *s = new Shape;

  • Shape *s = new Triangle;



В першу чергу для уможливлення нових застосувань клієнтських кодів

  • В першу чергу для уможливлення нових застосувань клієнтських кодів

  • Якщо клієнтський код не залежить жорстко від реалізації використаних в ньому засобів, то він може функціонувати на різних реалізаціях за умови використання спільного інтерфейсу



// Обробка стеку не залежить від його реалізації

  • // Обробка стеку не залежить від його реалізації

  • int process (Stack & stackToProcess)

  • {

  • int sum = 0;

  • while (!stackToProcess.empty())

  • {

  • sum += stackToProcess.top();

  • stackToProcess.pop();

  • }

  • return sum;

  • }



Як зробити функцію

  • Як зробити функцію

  • template

  • void process(Stack & stackToProcess);

  • придатною для обробки як одного типу стеку

  • StackDerivedFromArray stack;

  • process(stack);

  • так і іншого?

  • StackContainingArray stack;

  • process(stack);



// Інтерфейс стеків

  • // Інтерфейс стеків

  • template

  • class Stack

  • {

  • public:

  • virtual ~Stack(){};

  • virtual bool empty() const =0;

  • virtual const T& top() const =0;

  • virtual void pop() =0;

  • virtual void push(const T& value) =0;

  • };



Пізнє зв'язування через таблицю (указників) віртуальних функцій

  • Пізнє зв'язування через таблицю (указників) віртуальних функцій

  • Реалізацію візьмемо у похідному класі тоді, коли це стане можливим

  • Stack & stackToProcess:



StackContainingArray stachar(100);

  • StackContainingArray stachar(100);

  • process(stachar);

  • Stack & stackToProcess:



// Базовий клас

  • // Базовий клас

  • class Person

  • {

  • char * _name;

  • public:

  • Person (const char* name):_name (new char [strlen(name)+1])

  • {

  • strcpy (_name, name);

  • }

  • virtual ~Person()

  • {

  • delete [] _name;

  • }

  • };



// Похідний клас

  • // Похідний клас

  • class Student: public Person

  • {

  • char * _inmatriculation;

  • public:

  • Student (const char* name, const char* m):

  • Person(name), _inmatriculation (new char[strlen(m)+1])

  • {

  • strcpy (_inmatriculation, m);

  • }

  • virtual ~Student()

  • {

  • delete [] _inmatriculation;

  • }

  • };



Person * p = new Student("Qwerty","123456789");

  • Person * p = new Student("Qwerty","123456789");

  • delete p;

  • Якби деструктор не був би віртуальним спрацював би лише деструктор вжитого інтерфейсу: ~Person()

  • Висновок: деструктор має бути віртуальним (або невіртуальним захищеним: чому?)



Уникайте заплутаних ієрархій

  • Уникайте заплутаних ієрархій

  • Добра ієрархія легка для коректного вжитку, але складна і непристосована для некоректного використання



Схожі:

Відкритого успадкування iconЗакономірності успадкування ознак План: Поняття і терміни сучасної генетики. Основні закономірності успадкування: гіпотеза чистоти гамет
Закономірності успадкування ознак на організмовому рівні встановив Г. Мендель (1865)
Відкритого успадкування iconОрганізмовий рівень реалізації генетичної інформації. Взаємодія генів та їх прояв при різних типах успадкування. Зчеплене успадкування
Взаємодія генів та їх прояв при різних типах успадкування. Зчеплене успадкування
Відкритого успадкування iconІнформація про інституційні репозитарії Як забезпечується відкритий доступ? журнали відкритого доступу репозитарії відкритого доступу Журнали відкритого доступу: 2617
Грудень 2005: угода з Wellcome Trust щодо миттєвого відкритого доступу до статей, написаних за матеріалами досліджень, які фінансував...
Відкритого успадкування iconІнформація про інституційні репозитарії Як забезпечується відкритий доступ? журнали відкритого доступу репозитарії відкритого доступу Журнали відкритого доступу: 2617
Грудень 2005: угода з Wellcome Trust щодо миттєвого відкритого доступу до статей, написаних за матеріалами досліджень, які фінансував...
Відкритого успадкування iconЗакономірності успадкування Актуальність теми: Закономірності успадкування ознак на органіpзмовому рівні встановив Г. Мендель (1865). У людини
Закономірності успадкування ознак на органіpзмовому рівні встановив Г. Мендель (1865)
Відкритого успадкування iconЗакон України "Про інститути спільного інвестування (пайові та корпоративні фонди )" Ст. 7 Корпоративний інвестиційний фонд це ісі, який створюється у формі відкритого акціонерного товариства
Створення корпоративного інвестиційного фонду у формі відкритого акціонерного товариства: правові парадокси
Відкритого успадкування iconРозвиток ініціативи відкритого доступу в Україні Розвиток ініціативи відкритого доступу в Україні
Для керівництва установи: Можливість контролю за виконанням індивідуальних планів співробітників, ходу виконання ндр
Відкритого успадкування iconУмовні позначення Родовід сім’ї з аутосомно-домінантним типом успадкування

Відкритого успадкування iconІнформація про відкритий доступ. Детально про репозитарії відкритого доступу Ірина Кучма, програма "Соціальний капітал і Академічні публікації", Міжнародний фонд "Відродження"
Найостанніша інформація про відкритий доступ. Детально про репозитарії відкритого доступу Ірина Кучма
Відкритого успадкування iconВиявляється, що закрите успадкування взагалі більше схоже на агрегацію, а захищене так просто небезпечне


Додайте кнопку на своєму сайті:
dok.znaimo.com.ua


База даних захищена авторським правом ©dok.znaimo.com.ua 2013
звернутися до адміністрації
dok.znaimo.com.ua
Головна сторінка