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