Лекция 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 Спасибо за внимание Вопросы?