
- •Факультет прикладной математики и физики
- •Лабораторные работы 1 — 8 по курсу сппо:
- •1.Агрегация по ссылке (lab1.Cpp, lab1.Exe______________)
- •2.Агрегация по значению и вложением (lab1_vlog.Cpp,lab1_znach.Cpp,*.Exe)
- •1.Агрегация по ссылке
- •2.Агрегация по значению
- •2.Агрегация вложением
- •Void md() {
- •Void mf() {
- •Void me() {
- •3.Принцип подстановки
- •Int main()
- •4.1 Наследование: расширение, спецификация, специализация, конструирование(граф изменён)
- •4.2 Наследование: комбинирование(граф изменём)
- •5. Наследование: комбинирование через общих предков
- •Int main()
- •6.1 Ассоциация 1:1
- •Int main()
- •6.2 Ассоциация 1:n
- •7.1 Использование: клиент-сервер
- •7.2 Использование: общность
- •8.1 Конкретизация функции
- •8.2 Конкретизация класса
3.Принцип подстановки
// lab2_podst.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include <fstream>
#include "stdio.h"
using namespace std;
class A {
public:
A() {a = 0; cout << "constr A" << a << endl;}
//A супер класс, В под класс, вместо объекта супер класса А
//можно подставить объект подкласса В, также В супер класс для С.
virtual ~A() { cout << "distr A" << endl;}
virtual int getA() {return a=0;}
protected:
int a;
};
class B:
public A {
public:
B() {a = 1; cout << "constr B" << a << endl;}
~B() { cout << "distr B" << endl;}
int getA() {return a;}
};
class D:
public B {
public:
D() {a = 2; cout << "constr D" << a << endl;}
~D() { cout << "distr D" << endl;}
int Ma() {return a;}
};
Int main()
{
char ch;
cout << "hi" << endl;
A *a = NULL;
a = new A;
cout << a->getA() << endl;
delete a;//удаление объекта класса А по указателю а
cout << "step 1" << endl;
a = new B;//реализация подстановки
cout << a->getA() << endl;
delete a;
cout << "step2" << endl;
a = new D;//взяли указатель, вместо объекта супер класа подставляется объект подкласса
cout << a->getA() << endl;//берём объект D по указателю, вызываем супер ф-ю класса А, она замещается ф-ей класса D
if(dynamic_cast <D*>(a) != NULL)
{
cout << "yes D" << endl;
}
delete a;
cout << "step3" << endl;
{
D d;
}
_getche();
return 0;
}
4.1 Наследование: расширение, спецификация, специализация, конструирование(граф изменён)
Специализация
Расширение
Конструирование
Конструирование
(закрытое
наследование)
Спецификация
// lab2_nasl.cpp
#include "stdafx.h"
#include <iostream>
#include <clocale>
using namespace std;
class A {
protected:
int a;
public:
A():a(10) {}
virtual int fa() {return a;}
int fA() {return -a;}
};
class B:
public A {
public:
int fa() {return a + 1;} //переопределение fa()
};
class J:
public A { //расширение
protected:
int j;
public:
int fa() {return a*a;} //изменение аргументов (перегрузка)
int fj() {return j;} //изменение пространства имен
};
class C:
public A { //конструирование
protected:
int c;
public:
int fA(int i) {return i + a;}
virtual int fc() = 0;
int fC() {return c;}
};
class F:
public C { //спецификация
public:
int fc() {return a + 1000;}
};
class E:
public C { //спецификация
public:
int fc() {return a + 1001;}
};
class D:
private B { //конструирование (закрытое наследование)
public:
int fa() {return B::fa()*B::fa();} //конструирование
};
int main(int argc, char* argv[])
{
setlocale (LC_ALL,"Russian");
A *a = NULL;
cout << "=========== специализация ===========\n";
a = new A;
cout << a->fa() << endl;
delete a;
a = new B;
cout << a->fa() << endl; // принцип подстановки выполняется полностью
delete a;
cout << "=========== расширение ===========\n";
a = new A;
cout << a->fa() << endl;
delete a;
a = new J;
cout << a->fa() << endl; // принцип подстановки выполняется
//cout << a->fj() << endl; // частично
cout << "=========== спецификация ===========\n";
C *c = NULL;
//c = new C; //C - абстрактный класс
c = new F;
cout << c->fc() << endl;
c = new E;
cout << c->fc() << endl;
cout << "======= конструирование (закрытое насл) =======\n";
B *b = NULL;
b = new B;
cout << b->fa() << endl;
//b = new D; //принцип подстановки не выполняется
D d;
cout << b->fa() << endl;
return 0;
}