Alan Kay on formuleerinud
OOP 5 tähtsaimat printsiipi

1.	Everything is an object. Iga objekt on omapärane muutuja – objekt (nagu iga muutuja) hoiab endas andmeid, mis määravad objekti oleku. Iga objektiga on aga lahutamatult seotud ka mingid funktsioonid (meetodid), mille kaudu saab objekti olekut (objekti käitumist!) muuta. Programmis võib objektiks kuulutada praktiliselt suvalise mõiste.

2.	Programm on objektide kogum, mis saadavad üksteisele sõnumeid. Kui üks objekt soovib saata mõnele teisele objektile sõnumi (näit. päringu tema oleku kohta), siis see objekt pöördub teise objekti vastava meetodi (funktsiooni) poole.

3.	Igal objektil on oma isklik mälu, mis on reeglina suletud teistele objektidele. Seetõttu jääb objekti ehitus varjatuks (hidden implementation), sest objektiga saab reeglina suhelda ainult tema meetodite (objekti liidese, interface) kaudu.

4.	Iga objekt on konkreetset tüüpi. Ehk teisiti – iga konkreetne objekt on mingi objektitüübi (klassi) ilming (instance). Klassi kasutaja tahab teada vastuseid küsimustele:

–	mis teenuseid seda tüüpi objektid pakuvad?

–	milliseid sõnumeid saab seda tüüpi objektile saata?

5.	Kõik sama tüüpi objektid on ühesuguse ehitusega. Seetõttu kõik antud tüüpi objektid oskavad vastu võtta ühesuguseid sõnumeid.

Üldisematest objektitüüpidest on võimalik tuletada (derive) alamtüüpe. 

Näiteks kui on loodud klass Kujund, siis on võimalik sellest objektitüübist tuletada objektitüüp Ring, mis pärib (inherite) kõik klassi Kujund omadused (andmed ja meetodid). Seetõttu oskab iga Ring-tüüpi objekt vastu võtta ka kõiki selliseid sõnumeid, mida oskavad käsitleda Kujund-tüüpi objektid.

Seega – kirjutades üks kord valmis klassi Kujund programmikoodi (meetodid), kandub see programmilõik automaatselt üle kõikide klassist Kujund tuletatud klasside programmikoodi! 

Tuletamise-pärimise skeem ongi kõige tähtsam mehhanism, mis tagab OOP võimsuse ja efektiivsuse.  

OOP KEELED

Kolm omadust:

1)	kapseldamine (encapsulation) – keeles on vahendid, mis võimaldavad koondada andmed ja nendega tehtavad operatsioonid (meetodid) ühte programmilisse ühikusse (objektitüüp)

NB! objekti andmetele saab reeglina ligi ainult meetodite 
        kaudu!

2)	pärandamine (inheritance) – igast objektitüübist saab tuletada uusi objektitüüpe, kusjuures järglased pärivad eellase omadused (nii andmed kui meetodid)

3)	polümorfism (polymorphism) – samanimelised meetodid võivad erinevatel objektidel teostuda erineval viisil

     Objektitüüp					    Stack

pop

view

push

init

top

	

	

Andmed

OP 1

OP 2

OP 4

OP 3

Objektitüübid keeles C++

Kirjeldajad:    struct     union      class

	<kirjeldaja>   <objektitüübi_identifikaator>
	{
		<muutujad_ja_meetodid_=_LIIKMED_(members)>
	}

Juurdepääsu määrajad:      public    private    protected

1)	klassi (objektitüübi) meetodites on juurdepääs kõigile selle klassi liikmetele

2)	objektitüübi ilmingu kaudu on juurdepääs (liitnime abil) ainult avalikele liikmetele

Vaikimisi on liikmed:

	class		->	private
	struct		->	public
	union	->	public

Konstruktorid ja destruktorid

Konstruktor:

-	liikmefunktsioon, mille nimi ühtib klassi nimega

-	konstrutoril puudub väärtus (ka mitte void !)

-	konstruktor käivitatakse objekti ilmingu deklareerimise hetkel (ja ainult siis! – liitnimega ei saa pöörduda!)

-	konstruktoril võivad olla parameetrid

 Destruktorid:

-	liikmefunktsioonid objekti ilmingu “hävitamiseks”

-	nimi nagu konstrutoril, aga ees  ~  (tilde)

-	lubatud väljakutse liitnimega

-	objekti ilmingule rakendub destruktor automaatselt, kui programm “väljub” plokist, kus see ilming on deklareeritud

Klassi prototüüp

inline  liikmefunktsioonid

Viidad objektidele

this

Võtmesõna  this  on klassi meetodites predefineeritud viitmuutja, mille väärtuseks on viit “jooksvale” objektile:

	class Ilus
	{
		int x;
	public:
		Ilus( void )
		  {	
this -> x = -1;		// sama mis    x = -1;
		  } 
		Ilus  *aadress( void )
		   {
			return  this;		//  !!!
		    }
	}

Funktsioonide overload

Programmis (ka objektitüübis) võib olla mitu sama nimega funktsiooni (ka mitu konstruktorit), kui on kas erinev arv parameetreid VÕI parameetritel erinevad tüübid

Näide:

	class Midagi
	{
	public:
		Midagi( int );		//  1
		Midagi( char * );	//  2
		Midagi( int, int );	//  3
	}

// kuskil edasi:

	Midagi	k( 14, -3 ),		//  3
			l( 56740 ),		//  1
			m(“tere”),		//  2
			n;			// Viga!

Funktsioonide parameetrite vaikeväärtused:

void  proc( int n = 3, char c = ’x’ )
{
}
// ja kuskil mujal:

	proc( );
	proc( 7 );
	proc( , ’Y’ );
proc( -3, 33 );