62 lines
1.1 KiB
Markdown
62 lines
1.1 KiB
Markdown
# Наследования
|
|
|
|
```cpp
|
|
class A {
|
|
int a;
|
|
public:
|
|
A(int x = 0) : a(x) {}
|
|
void f() { cout << a; }
|
|
};
|
|
|
|
class B : public/private/protected A/*, C*/ { // private by default
|
|
int b;
|
|
public:
|
|
B(int x = 0, int y = 0) : A(x), b(y) {}
|
|
void f() {
|
|
cout << a << b; // error. A is private
|
|
}
|
|
};
|
|
```
|
|
|
|
```cpp
|
|
int main() {
|
|
A obj_a, *pa;
|
|
B obj_b, *pb;
|
|
pa = &obj_a;
|
|
pb = &obj_b;
|
|
|
|
// при открытом наследовании
|
|
pa = pb;
|
|
pb = (B*)pa;
|
|
|
|
// при закрытом наследовании
|
|
pa = (A*)pb;
|
|
// pb = (B*)pa; - невозможно
|
|
|
|
*pa = &obj_a;
|
|
pa->f(); // вызов из a
|
|
*pa = &obj_b;
|
|
pa->f(); // вызов тоже из a, т.к. не виртуальная функция
|
|
}
|
|
```
|
|
|
|
в ситуации любого наложения функций, происходит перекрытие имён
|
|
|
|
```cpp
|
|
class A {
|
|
void f();
|
|
}
|
|
|
|
class B : A {
|
|
void f(int) { f(); } // error
|
|
}
|
|
```
|
|
|
|
конструкторы не наследуются
|
|
|
|
## консруктор копирования
|
|
|
|
```cpp
|
|
B (const B &a) : A(a) {}
|
|
```
|