Лекция 16. Введение в ООП. Часть 7 Красс Александр Alexander.Krass@gmail.com СПбГУ ИТМО, 2008.

Презентация:



Advertisements
Похожие презентации
Лекция 15. Введение в ООП. Часть 6 Красс Александр СПбГУ ИТМО, 2008.
Advertisements

Лекция 18. Повторение и введение в STL (часть 1) Красс Александр СПбГУ ИТМО, 2008.
Лекция 11. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
Лекция 9. Введение в ООП. Часть 2 Красс Александр СПбГУ ИТМО, 2008.
Лекция 8. Введение в ООП. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.
Прикладное программирование кафедра прикладной и компьютерной оптики Наследование.
Лекция 10. Введение в ООП. Часть 3 Красс Александр СПбГУ ИТМО, 2008.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Лекция 13. Введение в ООП. Часть 4 Красс Александр СПбГУ ИТМО, 2008.
Наследование time time_with_sec В чем преимущества наследования? Наследование кода – поля, метод inc Появилось два класса с которыми точно можно обращаться.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
Лекция 5. Подготовка к ООП Красс Александр СПбГУ ИТМО, 2008.
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
Лекция 6. Введение в ООП через практику. Часть 1 Красс Александр СПбГУ ИТМО, 2008.
С++, начала ООП Семинар 3 Рябова Анна Сергеевна
ООП Классы Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Лекция 31. Динамическая информация о типе Красс Александр СПбГУ ИТМО, 2009.
1. Классы ООП 1.Наследование 2.Инкапсуляция 3.Полиморфизм.
Транксрипт:

Лекция 16. Введение в ООП. Часть 7 Красс Александр СПбГУ ИТМО, 2008

2 Темы Конструкторы и деструкторы при наследовании

3 Конструкторы при наследовании class A { public: A() { cout << "A()\n"; } }; class B : public A { public: B() { cout << "B()\n"; } }; void main() { A *a = new B; // Что мы увидим на экране? }

4 Конструкторы при наследовании class A { public: A() { cout << "A()\n"; } }; class B : public A { public: B() { cout << "B()\n"; } }; void main() { A *a = new B; // A() } // B()

5 Конструкторы при наследовании Множественное наследование – это зло! Но это не касается наследования интерфейсов.

6 Конструкторы при наследовании Пример интерфейса: class A { public: virtual void foo() = 0; virtual void boo() = 0; }

7 Конструкторы при наследовании Пример множественного наследования: class A {...}; class B {...}; class C : public A, public B {... };

8 Деструкторы при наследовании class A { int *i; public: A() { i = new int(5); } ~A() { cout << "~A() => delete i\n"; delete i; } }; class B : public A { int *j; public: B() { j = new int(7); } ~B() { cout << "~B() => delete j\n"; delete j; } }; void main() { A *a = new B; // Что мы delete a; // увидим? }

9 Деструкторы при наследовании class A { int *i; public: A() { i = new int(5); } ~A() { cout << "~A() => delete i\n"; delete i; } }; class B : public A { int *j; public: B() { j = new int(7); } ~B() { cout << "~B() => delete j\n"; delete j; } }; void main() { A *a = new B; // ~A() => delete a; // delete i } // Деструктор B не вызовется!

10 Деструкторы при наследовании class A { int *i; public: A() { i = new int(5); } virtual ~A() { cout << "~A() => delete i\n"; delete i; } }; class B : public A { int *j; public: B() { j = new int(7); } virtual ~B() { cout << "~B() => delete j\n"; delete j; } }; void main() { A *a = new B; // ~B() => delete a; // delete j } // ~A() => delete i

11 Для закрепления материала class A { int *i; public: A() { i = new int(5); } virtual void foo() { cout << "A::foo()\n"; } virtual ~A() { delete i; foo(); } }; class B : public A { int *j; public: B() { j = new int(7); } virtual void foo() { cout << "B::foo()\n"; } virtual ~B() { delete j; foo(); } }; void main() // Что мы увидим { // на экране? A *a = new B; delete a; }

12 Для закрепления материала class A { int *i; public: A() { i = new int(5); } virtual void foo() { cout << "A::foo()\n"; } virtual ~A() { delete i; foo(); } }; class B : public A { int *j; public: B() { j = new int(7); } virtual void foo() { cout << "B::foo()\n"; } virtual ~B() { delete j; foo(); } }; void main() // B::foo() { // A::foo() A *a = new B; delete a; }

13 Для закрепления материала class A { int *i; public: A() { i = new int(5); foo(); } virtual void foo() { cout << "A::foo()\n"; } }; class B : public A { int *j; public: B() { j = new int(7); foo(); } virtual void foo() { cout << B::foo()\n"; } }; void main() // Что мы увидим { // на экране? A *a = new B; delete a; }

14 Для закрепления материала class A { int *i; public: A() { i = new int(5); foo(); } virtual void foo() { cout << "A::foo()\n"; } }; class B : public A { int *j; public: B() { j = new int(7); foo(); } virtual void foo() { cout << B::foo()\n"; } }; void main() // A::foo() { // B::foo() A *a = new B; delete a; }

15 Спасибо за внимание Вопросы?