Лекция 16. Введение в ООП. Часть 7


The Presentation inside:

Slide 0

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


Slide 1

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


Slide 2

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


Slide 3

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()


Slide 4

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


Slide 5

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


Slide 6

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


Slide 7

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; // увидим? }


Slide 8

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 не вызовется!


Slide 9

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


Slide 10

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; }


Slide 11

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; }


Slide 12

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; }


Slide 13

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; }


Slide 14

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


×

HTML:





Ссылка: