INHERITANCE(Наследование)

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 specifiers ဆိုရာတြင္ ( public , protected , private ) တစ္ခုခု ၿဖစ္နိဳင္သည္။



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 မ်ားၿဖစ္တည္သြားမည္ၿဖစ္သည္။

Example. Inheriting from the specifier public.
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[])
{   Derob(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