Отчет по лабораторной работе №1
По дисциплине «Современные информационные технологии»
Студент: Колесников А.В.
Группа: СМ5-18
Руководитель: Силин С.И.
Москва 2015 г.
Задание №1 – ознакомление с областями public, protected, private
1) Скопмилируйте проект, набрав в консоли mingw32-make clean, затем mingw32-make
2) Запустите task1.exe и ознакомьтесь с последовательностью выводимых сообщений
3) Наберите в консоли "./test1.exe > log.txt" и нажмите Enter. При этом все сообщения сохранятся в файл log.txt
4) Объясните порядок вызова сообщений и последовательность действий
5) Выполните действия, отмеченные (*5*) в тексте программы. Объясните наблюдаемый эффект
6) Выполните действия, отмеченные (*6*) в тексте программы. Объясните наблюдаемый эффект
/*****************************
Примечание.
std::cout <<
используется для вывода текста в консоль.
Все что указывается после << будет выведено на экран
Вывод можно объединять в цепочку
std::cout << "Сегодня " << 19 " << " ноября " << 2015 << " года".
Будет выведено: "Сегодня 19 ноября 2015 года".
std::endl является служебной командой, которая используется для переноса строки
при выводе на экран. Она не обязательно должна идти последней в списке команд.
std::cout << 25 << std::endl << 36 << std::endl;
Будет выведено:
"25
"
*****************************/
#include <iostream>
class base_class
{
private:
void base_private_function()
{
std::cout << "Приватная функция базового класса" << std::endl;
}
protected:
void base_protected_function()
{
std::cout << "Защищенная функция базового класса" << std::endl;
base_private_function();
}
public:
base_class()
{
std::cout << "Конструктор базового класса" << std::endl;
}
~base_class()
{
std::cout << "Деструктор базового класса" << std::endl;
}
void base_public_function_1()
{
std::cout << "Публичная функция базового класса номер 1" << std::endl;
base_protected_function();
base_private_function();
}
void base_public_function_2()
{
std::cout << "Публичная функция базового класса номер 2" << std::endl;
base_protected_function();
base_private_function();
}
virtual void virtualized_public_function()
{
std::cout << "Виртуальная публичная функция базового класса" << std::endl;
base_protected_function();
base_private_function();
}
};
int main()
{
std::cout << "Старт програмы" << std::endl;
std::cout << "Объявляем переменную типа базовый класс с именем base" << std::endl;
base_class base;
std::cout << "Объявляем указатель на переменную типа базовый класс" << std::endl;
base_class *base_pointer;
std::cout << "Получаем адрес переменной base и кладем значение в указатель" << std::endl;
base_pointer = &base;
std::cout << "Пытаемся вызвать виртуальную функцию через саму переменную" << std::endl;
base.virtualized_public_function();
std::cout << "Пытаемся вызвать виртуальную функцию через саму переменную" << std::endl;
base.virtualized_public_function();
std::cout << "Пытаемся вызвать публичную функцию 1 через саму переменную" << std::endl;
base.base_public_function_1();
std::cout << "Пытаемся вызвать публичную функцию 2 через саму переменную" << std::endl;
base.base_public_function_2();
std::cout << "Пытаемся вызвать виртуальную функцию через указатель" << std::endl;
base_pointer->virtualized_public_function();
std::cout << "Пытаемся вызвать публичную функцию 1 через указатель" << std::endl;
base_pointer->base_public_function_1();
std::cout << "Пытаемся вызвать публичную функцию 2 через указатель" << std::endl;
base_pointer->base_public_function_2();
//std::cout << "Пытаемся получить доступ к защищенной функции извне класса. Для этого уберите // в следующей строке" << std::endl;
//base.base_protected_function();
//std::cout << "Пытаемся получить доступ к приватной функции извне класса. Для этого уберите // в следующей строке и верните // в предыдущей операции."<< std::endl;
// base.base_private_function();
return 0;
}
|
Задание 2 – ознакомление с наследованием и виртуальными функциями
1) Расставьте std::cout таким образом, чтобы установить, в каком порядке и какие функции будут вызваны из программы
2) Скопмилируйте проект, набрав в консоли mingw32-make
3) Запустите test2.exe и ознакомьтесь с последовательностью выводимых сообщений
4) Объясните порядок вызова сообщений и последовательность действий
6) Выполните действия, отмеченные (*6*) в тексте программы. Объясните наблюдаемый эффект
7) Выполните действия, отмеченные (*7*) в тексте программы. Объясните наблюдаемый эффект
/*****************************
Примечание.
std::cout <<
используется для вывода текста в консоль.
Все что указывается после << будет выведено на экран
Вывод можно объединять в цепочку
std::cout << "Сегодня " << "19 " << " ноября " << 2015 << " года."
Будет выведено: "Сегодня 19 ноября 2015 года".
std::endl является служебной командой, которая используется для переноса строки
при выводе на экран. Она не обязательно должна идти последней в списке команд.
std::cout << 25 << std::endl << 36 << std::endl;
Будет выведено:
"25
"
*****************************/
#include <iostream>
class base_class
{
private:
void base_private_function()
{
std::cout << "Приватная функция базового класса" << std::endl;
}
protected:
void base_protected_function()
{
std::cout << "Защищенная функция базового класса" << std::endl;
base_private_function();
}
public:
base_class()
{
std::cout << "Конструктор базового класса" << std::endl;
}
~base_class()
{
std::cout << "Деструктор базового класса" << std::endl;
}
void base_public_function_1()
{
std::cout << "Публичная функция базового класса номер 1" << std::endl;
base_protected_function();
base_private_function();
}
void base_public_function_2()
{
std::cout << "Публичная функция базового класса номер 2" << std::endl;
base_protected_function();
base_private_function();
}
virtual void virtualized_public_function()
{
std::cout << "Виртуальная публичная функция базового класса" << std::endl;
base_protected_function();
base_private_function();
}
};
// Это класс наследник от base
class derived_class: public base_class
{
private:
void derived_private_function()
{
}
protected:
void derived_protected_function()
{
derived_private_function();
}
public:
derived_class()
{
}
~derived_class()
{
}
void base_public_function_1()
{
std::cout << "Публичная функция производного класса с тем же именем, что и у базового" << std::endl;
derived_protected_function();
}
void derived_public_function_2()
{
std::cout << "Публичная функция производного класса номер 2" << std::endl;
base_protected_function();
//(*7*) ОШИБКА пытаемся обратиться в классе наследника к приватной функции базового класса
// derived_pointer->base_private_function();
}
void virtualized_public_function()
{
derived_protected_function();
}
};
int main()
{
std::cout << "создаем переменную типа базовый класс" << std::endl;
base_class base;
std::cout << "создаем указатель на переменную типа базовый класс" << std::endl;
base_class *base_pointer;
std::cout << "создаем переменную типа derived_class" << std::endl;
derived_class derived;
std::cout << "создаем указатель на переменную типа derived_class" << std::endl;
derived_class *derived_pointer;
std::cout << "Получаем адрес переменной derived и кладем значение в указатель" << std::endl;
derived_pointer = &derived;
std::cout << "Присваиваем указателю на базовый класс указатель на производный от него" << std::endl;
base_pointer = &derived;
// Так как с обращением к функциям класса через переменную мы уже ознакомились
// то теперь сосредоточимся на различиях при обращении через разные указатели
std::cout << "вызываем функцию базового класса через указатель на него" << std::endl;
base_pointer->base_public_function_1();
std::cout << "вызываем стандартную функцию базового класса (также являющейся функцией класса наследника)через указатель на производный класс" << std::endl;
derived_pointer->base_public_function_1();
std::cout << "вызываем функцию базового класса через указатель на производный класс" << std::endl;
derived_pointer->base_class::base_public_function_1();
//(*6*) ошибка - пытаемся обратиться через базовый класс к функции производного
//base_pointer->derived_public_function_2();
derived_pointer->derived_public_function_2();
base_pointer->virtualized_public_function();
derived_pointer->virtualized_public_function();
base_pointer->base_class::virtualized_public_function();
derived_pointer->base_class::virtualized_public_function();
return 0;
}
|