Наследование класов в С++.

Рубрика: C++, Дата: 27 March, 2013, Автор:
Tags:

Здорова господа!

Сегодня мы поговорим о наследовании классов, что это такое и как можно строить иерархии классов. От например какие бывают виды наследования? Бывает вроде 3 вида наследования public, protected, и private. Давайте разберем каждый вид наследования и посмотрим чем они отличаются.

Разберем сначала public наследование.

Наследование public.

Допустим есть у нас три класса A, D, E. У них есть по 2 члена закрытый и открытые члены класса (public и private). protected не берем он нам нафиг не нужен. (мб мы о нем пожже вспомним так для общего развития 🙂 ).

Вот код классов:

//nacledovanie klaccov
#include <iostream>
using std::cout;
using std::endl;

class A
{
	int ab;
public:
	int ac;
	//konctryktor po ymolchaniyu
	A():ab(3),ac(3){};
};

class D : public A
{
	int db;
public:
	int dc;
	//konctryktor po ymolchaniyu
	D():db(4),dc(4){};
	
	//proverochna9 function
	void print()
	{
		cout <<"ab= "<<"ab-private"<<" ac= "<<ac<<" db= "<<db<<" dc= "<<dc<<endl; 
	}
};

class E : public D
{
	int eb;
public:
	int ec;
	//konctryktor po ymolchaniyu
	E():eb(5),ec(5){};
	
	//proverochna9 function
	void print()
	{
		cout <<"ab= "<<"private"<<" ac= "<<ac<<" db= "<<"private"<<" dc= "<<dc<<endl;
	}
};

int main()
{
	A aa;
	D dd;
	E ee;
	
	cout <<dd.dc<<endl;
	dd.print();
	ee.print();
	
	return 0;
}

Сделаем класс D производным от А, а класс E производным от D. Наследование все будет : public – открытое. (D : public A, E : public D) Что мы имеем?. Рассмотрим каждый производный класс. Из класса D мо можем обращаться к открытым членам класса A, а из класса E к открытым членам классов как А так и D. К закрытым членам классов нельзя обращаться ни при каком наследовании, ни при public, ни при private, ни при protected. Так отлично.

Наследование private.

Теперь просто возьмем и изменим тип наследования допустим D : public A, а E : public D. Что же в этот раз у нас получится? Из D мы сможем обратится к открытым членам и методам класса A и только из него, из класса E мы уже не сможем обращаться к открытым методам и членам класса А. Вот опять кодец для теста:

//nacledovanie klaccov
#include <iostream>
using std::cout;
using std::endl;

class A
{
	int ab;
public:
	int ac;
	//konctryktor po ymolchaniyu
	A():ab(3),ac(3){};
};

class D : private A
{
	int db;
public:
	int dc;
	//konctryktor po ymolchaniyu
	D():db(4),dc(4){};
	
	//proverochna9 function
	void print()
	{
		cout <<"ab= "<<"ab-private"<<" ac= "<<ac<<" db= "<<db<<" dc= "<<dc<<endl; 
	}
};

class E : public D
{
	int eb;
public:
	int ec;
	//konctryktor po ymolchaniyu
	E():eb(5),ec(5){};
	
	//proverochna9 function
	void print()
	{
		cout <<"ab= "<<"private"<<" ac= "<<"Private"<<" db= "<<"private"<<" dc= "<<dc<<endl;
	}
};

int main()
{
	A aa;
	D dd;
	E ee;
	
	cout <<dd.dc<<endl;
	dd.print();
	ee.print();
	
	return 0;
}

Как видите подтвердилось.

От я все думаю рассмотреть ли protected наследование для полноты картины? хз. Ок. Щас попробуем потестить.

Наследование protected.

Я в этот раз изменил D : protected A и E : public D. И чо ж вы думали никоких изменений в выводе я не получил, я в классе D могу использовать открытые члены и методы класса A. Скажу просто, что при protected наследовании все открытые и protected члены базового класса, становятся protected членами производного класса. Вот кодец:

//nacledovanie klaccov
#include <iostream>
using std::cout;
using std::endl;

class A
{
	int ab;
public:
	int ac;
	//konctryktor po ymolchaniyu
	A():ab(3),ac(3){};
};

class D : protected A
{
	int db;
public:
	int dc;
	//konctryktor po ymolchaniyu
	D():db(4),dc(4){};
	
	//proverochna9 function
	void print()
	{
		cout <<"ab= "<<"ab-private"<<" ac= "<<ac<<" db= "<<db<<" dc= "<<dc<<endl; 
	}
};

class E : public D
{
	int eb;
public:
	int ec;
	//konctryktor po ymolchaniyu
	E():eb(5),ec(5){};
	
	//proverochna9 function
	void print()
	{
		cout <<"ab= "<<"private"<<" ac= "<<ac<<" db= "<<"private"<<" dc= "<<dc<<endl;
	}
};

int main()
{
	A aa;
	D dd;
	E ee;
	
	cout <<dd.dc<<endl;
	dd.print();
	ee.print();
	
	return 0;
}

Вот так то. Подведем итоги.

  1. При любом из трех типов наследования private члены базового класса недоступны.
  2. При public наследовании public и protected члены и методы базового класса, остаются такими же в производном классе.
  3. При private наследовании public и protected члены и методы базового класса становятся private в производном классе.
  4. При protected наследовании, public и protected члены и методы базового класса становятся protected.

Как оказалось ничего сложного нету.

rss