Inheritance(Наследование)
Inheritance ဆိုသည္မွာ class(класс) တစ္ခုသည္
အၿခား class တစ္ခုမွ properties မ်ားအားရရွိနိဳင္ေစရန္နွင့္ ထို class ထဲသို႕လည္း
မိမိ၏ properties မ်ားအားထည့္သြင္းနိဳင္ရန္အတြက္ classes မ်ားအား Hierarchy
(иерархия классов)စနစ္ကဲ့သို႕ ၿပဳလုပ္ဖန္တီးၿခင္းၿဖစ္သည္။ Class တစ္ခုသည္ အၿခား class တစ္ခု၏ inherits ၿဖစ္ေသာအခါ inherits ၿဖစ္ခံရေသာ
class ကို base class(базовый класс) ခုေခၚသည္။Inheriting ၿဖစ္ေနေသာ class အား
derived class(производного класса) ဟုေခၚသည္။ base class တစ္ခုအား စတင္ assignment ၿပဳလုပ္ၿပီး process
တစ္ခုစတင္ခဲ့လွ်င္ ထို base class ၏ qualities မ်ားသည္ ထို base class
တစ္ခုမွခြဲထြက္သြားေသာ class မ်ား၏ qualities မ်ားနွင့္ တူညီမည္ၿဖစ္သည္။ထို base
class သည္ စတင္သူၿဖစ္ေသာေၾကာင့္ ancestor(предок)(စတင္သူ) ဟုေခၚဆိုၿပီး
derived class အား တစ္ခါတစ္ရံ - descendant(потомки) (ဆင္းသက္လာသူ )
ဟုေခၚဆိုသည္။
Inheritance ၏ syntex(ေရးနည္းပံုစံ)
သည္ေအာက္ပါအတိုင္းၿဖစ္သည္။
class derived_class_name:access_specifier
base_class_name
{ // Declaration of a derived class };
Access specifier မ်ား၏အဓိကလုပ္ေဆာင္ခ်က္သည္
derived class မ်ားသည္ base class ဆီမွ မည္ကဲ့သို႕ inherited
ၿပဳလုပ္မည္ဆိုသည္အား အဓိက သတ္မွတ္ၿခင္းၿဖစ္သည္။
Example.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
// Базовый класс:
class B { int i;
public:
void set_i(int n) { i =
n; }
int get_i() { return i; }
};
/* Производный класс D будет наследовать все компоненты класса
В таким образом, что открытые элементы В будут
открытыми элементами D. Но к закрытым элементам B
доступа из D не будет. * /
/* derived class D သည္ class B ၏ components
အားလံုးအား inherit ၿပဳလုပ္ရာတြင္ class B ၏ public member မ်ားသာ classic D ၏
element မ်ားတြင္ inherit ၿပဳလုပ္နိဳင္မည္ၿဖစ္သည္။ class B ၏ private members
မ်ားသည္ class D တြင္ access ၿပဳလုပ္နိဳင္မည္မဟုတ္ေပ။ */
class D: public B
{ int j;
public:
void set_j(int n) { j =
n; }
int done() { if (j %2 == 0) return j * get_i();
else return j + get_i();
}
};
int _tmain(int argc, _TCHAR*
argv[])
{ D ob;
ob.set_i(10); // загрузка i в классе B
ob.set_j(5); // загрузка j в классе D
cout << ob.done(); //
будет выведено число 15
_getch();
return 0;
}
The derived class သည္ base class ၏ public
members မ်ားအား သူ၏ function နွင့္ elements မ်ားအပါအ၀င္ access ၿပဳလုပ္နိဳင္သည္။
အထက္ပါပရိုဂမ္တြင္ derived class B သည္ basic class D ထံမွ function get_i() အား
open(public) elements အၿဖစ္ၿပန္လည္ေခၚယူအသံုးၿပဳထားသည္ကို
ေတြ႕ၿမင္နိဳင္သည္။derived class D မွေခၚယူသံုးစြဲရာတြင္ public အေနၿဖင့္
အသံုးၿပဳေသာေၾကာင့္ base class ၏ private မ်ားသည္ derived class
တြင္သက္ေရာက္နိဳင္လိမ့္မည္မဟုတ္ေပ။
Inheritance အားေလ့လာရန္
နွစ္မ်ိဳးနွစ္စားခြဲၿခားနိဳင္သည္။
- Simple
inheritance(Простое наследование)
- Complex(complex)
inheritance(Множественное наследование)
Simple inheritance(Простое наследование)
Simple inheritance အားရိုးရွင္းစြာ ၿမင္သာေစရန္-
(၁)basic class တစ္ခုမွ derived class
တစ္ခု(သိုမဟုတ္)
(၂)basic class တစ္ခုမွတစ္ခုထက္ပိုေသာ derived
class မ်ား inheritance ၿဖစ္ေပၚၿခင္းဟု ႏွစ္မ်ိဳးနွစ္စားမွတ္ယူနိဳင္သည္။
ေအာက္တြင္ပံုနွင့္တကြ ေဖာ္ၿပထားသည္္။
Modes of access to elements of the base
class(Режимы доступа к элементам базового класса)
derived class မွ Base class element မ်ားဆီသို႕
mode of access သတ္မွတ္ၿခင္းဆိုသည္မွာ inheritance ၿပဳလုပ္ေသာအခါ အသံုးၿပဳမည့္
special access (public,private,protected) ေရြးခ်ယ္ခ်င္းၿဖစ္သည္။(ေအာက္ေဖာ္ၿပပါ
ပံုအတိုင္း)
ကၽြန္ေတာ္တို႕သည္ inheritance ၿပဳလုပ္ေသာအခါ
specifier access အား public
ေရြးခ်ယ္ခဲ့ပါက basic class ၏ public(open) elements မ်ားသည္ derived class ၏
public members မ်ားအၿဖစ္ ၿဖစ္သြားမည္ၿဖစ္သည္။Base class ၏ closed elements
မ်ားသည္ private အၿဖစ္က်န္ရွိေနၿပီး derived class မွ access ၿပဳလုပ္၍ရမည္မဟုတ္ေပ။
ကၽြန္ေတာ္တို႕သည္ inheritance ၿပဳလုပ္ေသာအခါ specifier access အား private အားအသံုးၿပဳခဲ့ပါက က basic class ၏ public elements မ်ားသည္ derived class ၏ private elements မ်ားအၿဖစ္ ၿဖစ္သြားမည္ၿဖစ္သည္။သုိ႕ေသာ္ ၎ elements မ်ားသည္ derived class ၏ elements မ်ားအၿဖစ္ functions မ်ားတြင္အသံုးၿပဳနိဳင္လိမ့္မည္ ၿဖစ္သည္။ Base class ၏ private elements မ်ားသည္ private အၿဖစ္က်န္ရွိေနၿပီး derived class မွ access ၿပဳလုပ္၍ရမည္မဟုတ္ေပ။
ကၽြန္ေတာ္တို႕သည္ တစ္ခါတစ္ရံတြင္ base class ၏ private elements မ်ားအား derived class သို႕ access ၿပဳလုပ္လိုေသာအခါ access specifier အား protected အၿဖစ္ေရြးခ်ယ္အသံုးၿပဳနိဳင္သည္။ protected access specifier သည္ private access specifier နွင့္တူညီေသာ္လည္း ၿခြင္းခ်က္တစ္ခုအေနၿဖင့္ protected access သည္ basic class ၏ protected members မ်ားအား derived class တြင္ ရရွိနိဳင္မည္ၿဖစ္သည္။
အကယ္၍ base class သည္ protected အၿဖစ္ inherite ၿပဳလုပ္ခံရလွ်င္ basic class ၏ public ႏွင့္ protected elements မ်ားသည္ derived class တြင္ protected members မ်ားၿဖစ္တည္သြားမည္ၿဖစ္သည္။
ကၽြန္ေတာ္တို႕သည္ inheritance ၿပဳလုပ္ေသာအခါ specifier access အား private အားအသံုးၿပဳခဲ့ပါက က basic class ၏ public elements မ်ားသည္ derived class ၏ private elements မ်ားအၿဖစ္ ၿဖစ္သြားမည္ၿဖစ္သည္။သုိ႕ေသာ္ ၎ elements မ်ားသည္ derived class ၏ elements မ်ားအၿဖစ္ functions မ်ားတြင္အသံုးၿပဳနိဳင္လိမ့္မည္ ၿဖစ္သည္။ Base class ၏ private elements မ်ားသည္ private အၿဖစ္က်န္ရွိေနၿပီး derived class မွ access ၿပဳလုပ္၍ရမည္မဟုတ္ေပ။
ကၽြန္ေတာ္တို႕သည္ တစ္ခါတစ္ရံတြင္ base class ၏ private elements မ်ားအား derived class သို႕ access ၿပဳလုပ္လိုေသာအခါ access specifier အား protected အၿဖစ္ေရြးခ်ယ္အသံုးၿပဳနိဳင္သည္။ protected access specifier သည္ private access specifier နွင့္တူညီေသာ္လည္း ၿခြင္းခ်က္တစ္ခုအေနၿဖင့္ protected access သည္ basic class ၏ protected members မ်ားအား derived class တြင္ ရရွိနိဳင္မည္ၿဖစ္သည္။
အကယ္၍ base class သည္ protected အၿဖစ္ inherite ၿပဳလုပ္ခံရလွ်င္ basic class ၏ public ႏွင့္ protected elements မ်ားသည္ derived class တြင္ protected members မ်ားၿဖစ္တည္သြားမည္ၿဖစ္သည္။
Example. Inheriting from the specifier public.
public access အေနၿဖင့္ inherting ၿပဳလုပ္ၿခင္းၿဖစ္သည္။
public access အေနၿဖင့္ inherting ၿပဳလုပ္ၿခင္းၿဖစ္သည္။
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
class Base { int i;
public:
void set_i(int n) { i = n; }
void show_i()
{ cout << i << endl; }
};
class Derived: public Base { int j;
public:
void set_j(int n) { j
= n; }
void show_j() { cout << j << endl;
}
};
int _tmain(int argc, _TCHAR*
argv[])
{ Derived
ob; // создаем объект ob класса Derived
ob.set_i(100); //
доступ к элементу класса Base
ob.set_j(200); //
доступ к элементу класса Derived
ob.show_i(); //
доступ к элементу класса Base
ob.show_j(); //
доступ к элементу класса Derived
_getch();
return 0;
}
Derived class သည္ Base class မွ inherite
ၿပဳလုပ္ေသာအခါ public access
အားအသံုးၿပဳထားေသာေၾကာင့္ Base class ၏ open element မ်ားသည္ Derived class
တြင္လည္း open elment မ်ားအၿဖစ္တည္ရွိမည္ၿဖစ္ၿပီး
မည္သည့္ေနရာမွမဆို access ၿပဳလုပ္နိဳင္မည္ၿဖစ္သည္။သို႕ေသာ္ base class ၏ private member element
ၿဖစ္ေသာ i ဆီသုိ႕တိုက္ရိုက္ ခ်ိတ္ဆက္ပါက error ၿဖစ္ေပၚလိမ့္မည္ၿဖစ္သည္။(i သည္ private(close) element
ၿဖစ္ေသာေၾကာင့္)။
Example.
class Derived: public Base
{ int j;
public:
void
set_j (int n) {j = n;}
void show_i_j () {cout << i << ''
<< j << endl;} / /
Error Access to i
};
Example. Inheritance specifier private.
private access အေနၿဖင့္ inherting
ၿပဳလုပ္ၿခင္းၿဖစ္သည္။
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
class Base { int i;
public:
void set_i(int n) { i = n; }
void show_i()
{ cout << i << endl; }
};
/* Создаем класс Derived. Доступ к элементу i класса Base происходит через его
открытые элементы, а к элементу j класса Derived непосредственно. */
/* create a derived class.Access to the element
i of Base is through its public members,and the the element j of derived
directly. */
(ေအာက္တြင္ Derived class ဖန္တီးၿခင္းၿဖစ္ၿပီး ၎
တြင္ Base class ၏ i element မ်ား access ၿပဳလုပ္ရာတြင္ public_element အၿဖစ္မွ
ၿပဳလုပ္ရမည္ၿဖစ္ၿပီး ၎ derived class ၏ j element အား တိုက္ရိုက္ access
ၿပဳလုပ္နိဳင္သည္ၿဖစ္သည္။)
class Derived: private Base
{ int j;
public:
void set_i_j(int m, int n) { set_i(n); j = m; }
void show_i_j() { show_i(); cout << j <<
endl; }
};
int _tmain(int argc, _TCHAR*
argv[])
{ Derived
ob;
ob.set_i_j(100, 200);
ob.show_i_j();
_getch();
return 0;
}
အထက္ေဖာ္ၿပပါ ပုစၦာတြင္ သတိၿပဳရန္မွာ base class ၏
public member မ်ားသည္ derived class ၏ private member မ်ားၿဖစ္လာသည္ၿဖစ္ၿပီး
set_i() နွင့္ show_i() functions တို႕အား program မွတိုက္ရိုက္ access
မၿပဳနိဳင္ေပ။
Example. Inheritance protected class members as
public.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
class Base {protected:
int i;
public:
void set_i(int n) { i = n; }
};
// Создаем класс Derived. Доступ к защищенному
элементу i класса Base происходит
// непосредственно из класса Derived.
class Derived: public Base { int j;
public:
void set_j(int n) { j
= n; }
void show_i_j() { cout << i << ' ' << j << endl; }
};
int _tmain(int argc, _TCHAR*
argv[])
{ Derived
ob;
ob.set_i(100);
ob.set_j(200);
ob.show_i_j();
_getch();
return 0;
}
Base class ၏ protected element ၿဖစ္ေသာ i သည္
public အၿဖစ္ inherited ၿဖစ္ေသာေၾကာင့္ Derived class ၏ function_element
မ်ားအားလံုးသည္ access ၿပဳလုပ္နိဳင္မည္ၿဖစ္သည္။
Behavior of constructors and destructors in
inheritance
(Поведение конструкторов и деструкторов при
наследовании)
Inheritance တြင္ base class နွင့္ derived class
တို႕၏ constructor(конструктор) (သုိ႕) destructor
(деструктор)၏လုပ္ေဆာင္ခ်က္ဆိုသည္မွာ constructor သည္ inheritance အစဥ္အတိုင္း
ၿပဳလုပ္မည္ၿဖစ္ၿပီး destructor သည္ ေၿပာင္းၿပန္ လုပ္ေဆာင္မည္ၿဖစ္သည္။ဆိုလိုသည္မွာ basic class ၏ constructor သည္ ပထမဆံုးအေနၿဖင့္
execute ၿပဳလုပ္သည္ၿဖစ္ၿပီး derived class ၏ constructor သည္ ဒုတိယအေနၿဖင့္
execute ၿပဳလုပ္သည္ၿဖစ္သည္။destructor သည္ ေၿပာင္းၿပန္ၿဖစ္ေသာေၾကာင့္ derived
class ၏ destructor သည္ အရင္ဆံုး execute ၿပဳလုပ္သည္ၿဖစ္ၿပီး basic class ၏
destructor သည္ ဒုတိယအေနၿဖင့္ execute ၿပဳလုပ္မည္ၿဖစ္သည္။
Derived class (သို႕) base class ၏ constructor
မ်ားအတြက္ argument မ်ား passing ၿပဳလုပ္ရန္အတြက္ ေအာက္ေဖာ္ၿပပါနည္းအတိုင္း
ၿပဳလုပ္ရမည္ၿဖစ္သည္။derived class တြင္
initialization ၿပဳလုပ္ရန္ argument မ်ားအား passing ၿပဳလုပ္လွ်င္
ပံုမွန္အတိုင္းပင္ ၿပဳလုပ္ရမည္ၿဖစ္သည္။အကယ္၍ base class ၏ constructor အား argument မ်ား passing
ၿပဳလုပ္ရန္လိုအပ္လွ်င္ ေအာက္ေဖာ္ၿပပါ စည္းမ်ဥ္းအတိုင္း ၿပဳလုပ္ရမည္ၿဖစ္သည္။
1. all the arguments of the base and
the derived class is passed to the constructor of the derived class,(base
class နွင့္ derived class တို႕၏ argument မ်ားအားလံုးတို႕သည္ derived class ၏
constructor ဆီသို႕ passing ၿပဳလုပ္ရမည္ၿဖစ္သည္)
2. using the extended form of
declaration derived class constructor, relevant arguments are passed on to the
base class.(derived class မွ constructor အား ထပ္မံ extended ၿပဳလုပ္ရန္ declare
ၿပဳလုပ္လွ်င္ သက္ဆိုင္ရာ argument မ်ားသည္ base class ဆီသို႕ passing
ၿပဳလုပ္ရမည္ၿဖစ္သည္။)
Derived class မွ base class ဆီသို႕ argument
မ်ာအား passing ၿပဳလုပ္ေသာ syntax သည္ ေအာက္ပါအတိုင္း ၿဖစ္သည္။
constructor_derived_class(arguments) :
name_basic_class(arguments)
{
//Define the constructor of the derived class
}
Base နွင့္ derived class မ်ား၏ argument မ်ားအား
တစ္ခုတည္းအေနၿဖင့္ တူညီစြာအသံုးၿပဳနိဳင္သည္။
Example. Constructors derived and base classes
share the same argument. In this case, the derived class, sends it to the base.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
class Base { int i;
public:
Base(int n) { cout << "Конструктор
базового класса" << endl;
i = n;
}
~Base()
{ cout << "Деструктор
базового класса" << endl; }
void show_i() { cout << i << endl; }
};
class Derived: public Base { int j;
public:
Derived(int n): Base(n)
{ cout << "Конструктор
производного класса\n";
j = n;
}
~ Derived()
{cout << "Деструктор
производного класса\n";}
void show_j() { cout << j << endl;
}
};
int _tmain(int argc, _TCHAR*
argv[])
{ Derived
ob(50);
ob.show_i();
ob.show_j();
_getch();
return 0;
}
Example. Pass one argument to the base class in
the derived. Another argument used directly derived class constructor.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
class Base { int i;
public:
Base(int n) { cout << "Конструктор базового класса" << endl;
i
= n;
}
~Base() { cout << "Деструктор базового класса" << endl; }
void show_i() { cout << i << endl; }
};
class Derived: public Base { int j;
public:
Derived(int n, int m): Base(m)
{ cout << "Конструктор
производного класса\n";
j = n;
}
~ Derived()
{cout << "Деструктор
производного класса\n";}
void show_j() { cout << j << endl;
}
};
int _tmain(int argc, _TCHAR*
argv[])
{ Derived ob(50,
70);
ob.show_i();
ob.show_j();
_getch();
return 0;
}
Multiple inheritance(Множественное наследование)
Derived class သည္ Base class တစ္ခုထက္ပို၍
inherit ၿပဳလုပ္ရန္ နည္းလမ္းနစ္ခုရွိသည္ရွိသည္ ၿဖစ္သည္။
(1)creating class hierarchy(Создание иерархии
классов)
(2)direct inheritance of multiple base
class(Прямое наследование нескольких базовых классов)
(1)creating class hierarchy
Derived class တစ္ခုသည္ အၿခားေသာ derived class
တစ္ခု၏ base class အၿဖစ္အသံုးၿပဳၿခင္းအားၿဖင့္ multiple calss hierarchy တစ္ခု
ဖန္တီးနိဳင္သည္။
ေဖာ္ၿပပါ Hierarchical structure တြင္ constructor
သည္ inheritance အစဥ္အတိုင္း execute ၿပဳလုပ္မည္ၿဖစ္ၿပီး destructor သည္
ေၿပာင္းၿပန္ execute ၿပဳလုပ္မည္ၿဖစ္သည္။
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
class Bas { int i;
public:
Bas(int n) { i = n; }
int get_i() { return i; }
};
class Der1: public Bas { int j;
public:
Der1(int n, int m): Bas(m) { j = n; }
int get_j() { return j; }
};
class Der2: public Der1 { int k;
public:
Der2(int n, int m, int l): Der1(m, l)
{ k = n; }
void show() { cout << get_i() << ' '
<< get_j() << ' '
<< k << endl;
}
};
int _tmain(int argc, _TCHAR*
argv[])
{ Der2 ob(50, 70,
90);
ob.show(); //
на экран будет выведено: 90 70 50
_getch();
return 0;
}
အထပ္ေဖာ္ၿပပါ ပုစၦာ၏ အရုပ္ၿပပံုသည္
ေအာက္ပါအတိုင္းၿဖစ္သည္။
(2)Direct inheritance of multiple classes
Derived class တစ္ခုသည္ base class တစ္ခုထက္ပို၍
မ်ားစြာေသာ base class ဆီမွ inherit ၿပဳလုပ္နိဳင္သည္။
ေပးထားေသာ ပံုအရ extended မ်ားအား ေၾကၿငာရာတြင္
ေအာက္ပါအတုိင္းေၾကၿငာရမည္ ၿဖစ္သည္။
class name_derived_class : specifier_access name_base_class_1,
specifier_access name_base_class_2,
………………..
specifier_access name_base_class_N
{ //class definition
}
Specifier_access မ်ားသည္ class တိုင္းအတြက္
တူညီမွဳ႕မရွိပဲ ကြဲၿပားနိဳင္သည္။basic class မ်ားစြာမွ inherited ၿပဳလုပ္ခံရေသာအခါ
constructor မ်ားသည္ derived class မွ ေၾကၿငာထားသည့္အတိုင္းပင္ left to right
အတိုင္း execute ၿပဳလုပ္သြားမည္ၿဖစ္သည္။
Derived class ၏ constructor အား extend
ၿပဳလုပ္ၿပီး parameter မ်ားအား
declare ၿပဳလုပ္ေသာ ပံုစံသည္ ေအာက္ပါအတိုင္း ၿဖစ္သည္။
constructor_derived_class(argument) :
name_base_class_1(argument),
name_base_class_2(argument),
……………
name_base_class_N(argument)
{
//Define the constructor of the derived class
}
Example 21.9.Direct inheritance of multiple (two) base classes (see Figure).
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
class Bas1 { int i;
public:
Bas1(int n) { i = n; }
int get_i() { return i; }
};
class Bas2 { int j;
public:
Bas2(int n) { j = n; }
int get_j() { return j; }
};
class Der: public Bas1, public Bas2
{ int k;
public:
//
здесь l и m передаются в Bas1 и Bas2 отдельно
Der(int n, int m, int l): Bas1(l),
Bas2(m) { k = n; }
void show() { cout << get_i() << ' ' << get_j() << ' ' << k << endl; }
};
int _tmain(int argc, _TCHAR*
argv[])
{ Der ob(50, 70,
90);
ob.show(); //
на экран будет выведено: 90 70 50
_getch();
return 0;
}
translated by zmk@miet51
No comments:
Post a Comment