Читайте также:
|
|
Наследование – это механизм, посредством которого один класс может наследовать элементы другого существующего класса, а также дополнять или изменять их свойства. Имеющиеся классы при этом называются базовыми (порождающими), а новые классы, формируемые на основе базовых – производными (порождёнными). Базовый класс определяет те качества, которые будут общими для всех производных от него классов. Таким образом, базовый класс представляет собой наиболее общее описание ряда характерных черт. Производный класс наследует эти общие черты и добавляет свойства, характерные только для него. При наследовании классов важную роль играет ключ (статус) доступа компонентов.
Формально производный класс описывается следующим образом:
class имя_класса: [ключ доступа] имя_базового_класса { тело класса };
Ключ доступа (private, protected, public) определяет то, как элементы базового класса наследуются производным классом. Если спецификатором доступа является ключевое слово public, то все открытые члены базового класса остаются открытыми и в производном. Если спецификатором доступа является ключевое слово private, то все открытые члены базового класса в производном классе становятся закрытыми. В обоих случаях все закрытые члены базового класса в производном классе остаются закрытыми и недоступными. Базовый класс может также наследоваться производным классом как защищённый (protected). В этом случае открытые и защищённые члены базового класса становятся защищёнными членами производного класса.
Если производный класс имеет одного родителя, то такое наследование называется простым.
class A { … };
class B: public A {…};
Если производный класс имеет несколько базовых классов, то такое наследование называется множественным.
class A {…};
class B {…};
class C {…};
class D: A, protected B, public C {…};
По умолчанию для классов используется ключ доступа private. Множественное наследование применяется для того, чтобы обеспечить производный класс свойствами двух или более базовых. Чаще всего один из этих классов является основным, а другие обеспечивают некоторые дополнительные свойства, поэтому они называются классами подмешивания. По возможности классы подмешивания должны быть виртуальными и создаваться с помощью конструкторов без параметров. Любой производный класс может, в свою очередь, становиться базовым для других классов.
Базовый класс, производный класс или оба класса вместе могут иметь конструкторы и/или деструкторы. В этом случае конструкторы выполняются в порядке наследования, а деструкторы – в обратном порядке. Таким образом, конструктор базового класса выполняется раньше конструктора производного класса. Для деструкторов правилен обратный порядок: деструктор производного класса выполняется раньше деструктора базового класса.
При наследовании некоторые имена методов могут быть по-новому определены в производном классе. В этом случае соответствующие компоненты базового класса становятся недоступными из производного класса. Для доступа из производного класса к компонентам базового класса, имена которых повторно определены в производном, используется операция уточнения области видимости (::).
Пример: Реализовать базовый класс rational для создания и работы с рациональной (несократимой) дробью. Дробь представляется парой целых чисел а (числитель) и b (знаменатель). Реализовать методы сложения дробей (a,b)+(c,d)=(ad+bc, bd); вычитания дробей (a,b)-(c,d)=(ad-bc, bd); умножения (a,b)(c,d)=(aс,bd) и деления дробей (a,b)/(c,d)=(ad, bc). Определить производный класс fraction, в котором реализовать метод сравнения дробей, а также метод сокращения дроби.
#include<iostream.h>
#include<conio.h>
class rational {
int chisl;
int znam;
public:
int chisl;
int znam;
rational (int c=1, int z=1) {chisl=c; znam=z;}
void sloz(rational x);
void vichit(rational x);
void umnoz (rational x);
void delen (rational x);
void show(); };
class fraction: public rational { public:
fraction (int a=1, int b=1) {chisl=a; znam=b;}
void sokr (int n);
int sravn (fraction a);};
void rational::sloz(rational x) {chisl=chisl*x.znam+znam*x.chisl; znam=znam*x.znam; };
void rational::vichit(rational x) {chisl=chisl*x.znam+znam*x.chisl;znam=znam*x.znam;};
void rational::umnoz (rational x) {chisl*=x.chisl; znam*=x.znam;}
void rational::delen (rational x) {chisl*=x.znam; znam*=x.chisl;}
void rational::show() {cout<<chisl<<'/'<<znam;}
void fraction::sokr (int n) { if (chisl%n==0 && znam%n==0)
{ chisl/=n; znam/=n;cout<<"\n Yes"; cin.get();}
else {cout<<"\n No";cin.get();} }
int fraction::sravn (fraction x) {if ((float)chisl/znam==(float)x.chisl/x.znam) return 0;
else return 1; }
main()
{ rational D1(2,5), D2 (1,3);
fraction D3(4,8),D4(1,2);
int k; clrscr(); cout<<"\n Proverka slozenia drobei \n";
D2.show();cout<<'+'; D4.show();cout<<'='; D2.sloz(D4);D2.show();cout<<endl;
cout<<"\n Proverka vichitania drobei \n";
D4.show();cout<<'-'; D3.show();cout<<'='; D4.vichit(D2);D4.show();cout<<endl;
cout<<"\n Proverka umnozenia drobei \n";
D1.show();cout<<'*'; D3.show();cout<<'='; D1.umnoz(D3);D1.show();cout<<endl;
cout<<"\n Proverka delenia drobei \n";
D3.show();cout<<':'; D2.show();cout<<'='; D3.sloz(D2);D3.show();cout<<endl;
cout<<"\n Sokratit na="; cin>>k;
D3.sokr(k);D3.show();
if (D3.sravn(D4)==0) cout<<"\n Drobi sovpadaut"; else cout<<"\n Drobi ne sovpadaut";
cin.get();}
Дата добавления: 2015-07-16; просмотров: 83 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Задание 2. | | | Задание к практической работе. |