Наследование
.pdf
Наследование нескольких
классов
class base1{ protected: int x; public:
void showx(){cout<<x<<‘\n’;}
};
class base2{ protected: int y;
public:
void showy(){cout<<y<<‘\n’;}
};
class derived:public base1, public base 2{
public:
void set(int i, int j ){x=i; y=j;} };
int main(){ derived obj; obj.set(4,5); obj.showx(); obj.showy();
return 0;
}
Примеры
Class1
-a1 +a2
«protected»
Class2
-b1 #b2
Object1 : Class2 |
|
|
a1 |
закрыто в Class1 |
|
a2 |
||
|
||
b1 |
protected |
|
b2 |
||
|
class Class1{ int a1;
public: int a2;
};
class Class2:protected Class1{ int b1;
protected: int b2;
};
Пример
|
|
|
|
|
|
classD |
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-d |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
«private» |
|
|
«protected» |
|||||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
classB |
|
|
classA |
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
-b1 |
|
#a |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
+b2 |
||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
obj : classD |
закрыто в classB |
|
b1 |
protected |
|
b2 |
||
private |
||
a |
||
|
||
d |
|
class classA{ protected: int a;
};
class classB{ int b1; public:
int b2; };
class classD:protected classB, private classA{
int d; };
Пример
Class1
-a1 +a2
public
Class2
-b1 #b2
«protected»
Class4
#c1
Закрыто в Class1
obj : Class4
a1
a2
b1
b2
c1
Закрыто в Class 2
class Class1{ int a1; public:
int a2; };
class Class2:public Class1{ int b1;
protected: int b2;
};
class Class4:public Class2{ protected:
int c1; };
|
|
|
|
|
|
Перегрузка методов |
||
|
|
|
|
|
|
|||
|
|
|
|
|
||||
|
|
|
|
|
|
|
void post_student::set_diplomdata(){ |
|
|
|
|
|
|
|
|
||
#include |
|
<iostream> |
||||||
|
cout<<"Data from first diploma:\n"; |
|||||||
using namespace std; |
||||||||
|
||||||||
|
|
|
|
|
|
|
cout<<"kvalification -"; |
|
class student{ |
|
cin>>first_diploma; |
|
char name[20]; |
|
cout<<"diplome number - "; |
|
char group[10]; |
|
cin>>first_d_number; |
|
public: |
|
} |
|
|
|
||
void set(); |
|
void post_student::print(){ |
|
void print(); |
|
||
|
student::print(); |
||
}; |
|
||
|
cout<<"Data for second education student\n "; |
||
void student::set(){ |
|
||
|
cout<<"first diploma: "<<first_diploma<<endl; |
||
cout<<"Input name: “; |
cin>>name; |
||
|
|||
cout<<"Input group“; |
cin>>group; |
cout<<" first diploma N "<<first_d_number<<'\n'; |
|
|
|||
} |
|
} |
|
void student::print(){ |
|
int main() |
|
cout<<"Sudent:\n"; |
|
{ |
|
cout<<"Second name: "<< name<<"\n group - "<<group<<'\n'; |
post_student st1; |
||
} |
|
st1.set(); |
|
|
|
||
class post_student:public student{ |
st1.set_diplomdata(); |
||
char first_diploma[10]; |
|
||
|
st1.print(); |
||
char first_d_number[10]; |
|
||
|
cin.get(); |
||
public: |
|
||
|
cin.get(); |
||
void set_diplomdata(); |
|
||
|
|
||
void print(); |
|
return 0; |
|
|
|
||
}; |
|
} |
|
Конструкторы
Вызываются в порядке происхождения классов.
конструктор_произоводного_класса(список аргументов ):
base1(список аргументов) ,base2(список аргументов),…, baseN(список аргументов)
{
//Тело конструктора производного класса
}
Пример. Конструкторы
#include <iostream> |
class derived: public base { |
|
int j; |
||
|
||
using namespace std; |
public: |
|
derived(int x, int y): base(y) |
||
|
||
class base { |
{ j = x; cout << "Constructing |
|
derived\n"; } |
||
|
||
protected: |
~derived() { cout << "Destructing |
|
derived\n"; } |
||
int i; |
void show() { cout << i << " " << j << |
|
|
"\n"; } |
|
public: |
}; |
|
base(int x) { i = x; cout << |
int main() |
|
"Constructing base\n"; } |
{ |
|
|
derived ob(3, 4); |
|
~base() { cout << "Destructing base\n"; |
ob.show(); |
|
} |
return 0; |
|
}; |
||
} |
||
|
Деструкторы
Вызываются в обратном порядке, сначала вызывается деструктор класса, определяющего тип объектной переменной, а затем – деструктор базового класса, и т.д.
Преимущества наследования
Возможность повторного использования кода;
Возможность отразить взаимоотношения объектов, свойственные предметной области;
Возможность рассматривать производный класс как подкласс базового, упрощая реализацию кода для производного класса;
Возможность обработки производных классов методами, разработанными при проектировании базового класса;
Возможность обновления или изменения содержания этих методов применительно к объектам производного класса, если такая необходимость имеется.
MFC
