Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++ / Указатель this.doc
Скачиваний:
106
Добавлен:
02.04.2015
Размер:
145.41 Кб
Скачать

Основная форма наследования

сlass имя_производного_класса: режим доступа имя_базового класса

{

};

Здесь режим доступа:

public, protected или private

Режим доступа к элементу в базовом классеРРР

Режим доступа при наследовании класса

Режим доступа к элементу в производном классе

Комментарий

private

protected

public

public

Недоступен

protected

public

Все public и protected члены базового класса остаются public и protected членами производного класса

private

protected

public

protected

Недоступен

protected

protected

Все public и protected члены базового класса становятся protected членами производного класса

private

protected

public

private

Недоступен

private

private

Все public и protected члены базового класса становятся private членами производного класса

Множественное наследование

сlass имя_производного_класса: список базовых классов

{

};

Например,

class base1

{protected:

int x;

public:

void showx(){cout<<x<<endl;}

};

class base2

{ protected:

int y;

public:

void showy(){cout<<y<<endl;}

};

class derived:public base1,public base2

{

public:

void set(int i,int j) {x=i;y=j;}

};

int main( )

{

derived ob;

ob.set(10,20);

ob.showx();

ob.showy();

system("pause");

return 0;

}

Передача параметров конструкторам базового класса

Конструктор_производного_класса(список аргументов):

Base1(список аргументов),

Base2(список аргументов), . . .

BaseN(список аргументов);

{

тело конструктора производного класса

}

Base1, Base2,…BaseN- имена базовых классов, наследуемых производным классом.

class base

{protected:

int i;

public:

base(int x) // конструктор

{ i=x;

cout<<"create base-object "<<endl;

}

~base(){}; // деструктор

};

class derived:public base

{

int j;

public:

derived(int x,int y):base(y)

{

j=x;

cout<<"create derived-object"<<endl;

}

~derived(){};

void show() {cout<<i<<" "<<j<<endl;}

};

int main()

{

derived ob(3,4);

ob.show();

system("pause");

return 0; }

  • Аргументы для конструктора базового класса передаются через аргументы, принимаемые конструктором производного класса

  • Если конструктор производного класса не использует никаких аргументов, он, тем не менее , должен объявить один или несколько аргументов, если базовый класс содержит конструктор с параметром.

Виртуальные базовые классы

Базовый класс

Производный от A класс

Производный от A класс

Производный от B и C класс

class A{

public:

int i;

};

class B:public A{

public:

int j;

};

class C:public A{

public:

int k;

};

class D:public B,public C{

public:

int sum;

};

Класс D наследует оба класса B и С, поэтому в классе D существует две копии класса A ( неоднозначность)

D ob;

ob.i=1; - это неверно, т.к. не ясно, к какой копии это относится

Пути разрешения неоднозначности

Применение оператора разрешения

Использование виртуального базового класса

int main( )

{

D ob;

ob.B::i=1; ob.j=2; ob.k=3;

ob.sum=ob.B::i+ob.j+ob.k;

cout <<ob.B::i<<endl;

cout <<ob.j<<” “<<ob.k<<endl;

cout <<ob.sum;

}

class A{

public:

int i;

};

class B:virtual public A{

public:

int j;

};

class C:virtual public A{

public:

int k;

};

class D:public B,public C{

public:

int sum;

};

int main( )

{

D ob;

ob.i =1; ob.j=2; ob.k=3;

ob.sum=ob.i+ob.j+ob.k;

cout <<ob.i<<endl;

cout <<ob.j<<” “<<ob.k<<endl;

cout <<ob.sum;

}

  • Виртуальное наследование базового класса гарантирует, что в любом производном классе будет присутствовать только одна его копия

  • Для классов, задающих виртуальный класс справедлива последовательность действий:

B myob;

myob.i=5;