Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Titulnyy_list_otcheta_C++.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
306.18 Кб
Скачать

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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]