
- •Конструкторы копии и параметры функции
- •Указатель this
- •Встраиваемые (inline-функции)
- •Функции-друзья (friend)
- •Перегрузка операторов с использованием функций-членов класса
- •Перегрузка операторов отношения и логических операторов
- •Перегрузка операторов ввода-вывода
- •Основная форма наследования
- •Множественное наследование
- •Передача параметров конструкторам базового класса
- •Виртуальные базовые классы
- •Виртуальные функции
Основная форма наследования
с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; |