Факультет ИСиТ Вторник, 19.03.2024, 07:41
Приветствую Вас Гость | RSS
[ Персональный раздел · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Факультет ИСиТ СыктГУ - Форум » Компьютеры / Интернет / Информационные системы и технологии » Программирование » ООП для самых маленьких (Основы ООП и библиотеки STL)
ООП для самых маленьких
eXceed Дата: Четверг, 08.05.2008, 02:51 | Сообщение # 1
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Данный раздел создан для того, чтоб научить читателя основам ООП.
Для компиляции примеров подойдет Microsoft Visual Studio 2005 Express(сам я использую Team Suite)

Проект по умолчанию:
Создаете новый проект Win32 Console Application. Далее выбираете опцию: Пустой проект.
После создания проекта добавьте в проект новый C++ файл main.cpp(зависит от настроек IDE). Надюсь разберетесь сами =) Тут ничего сложного нет.

1. Введение в классы С++

Механизм классов в C++ позволяет пользователям определять собственные типы данных. По этой причине их часто называют пользовательскими типами. Класс может наделять дополнительной функциональностью уже существующий тип.

Определение класса состоит из двух частей: заголовка, включающего ключевое слово class, за которым следует имя класса, и тела, заключенного в фигурные скобки. После такого определения должны стоять точка с запятой или список объявлений:

Пример:
...
class MyClass
{
public:
MyClass(void);
virtual ~MyClass(void);
};

Здесь объявлен класс MyClass с методом доступа public, конструктором MyClass, деструктором ~MyClass объявленным как вирутальный. Об этом позже.
Каждый класс начинается с этих строк wink

Каждое определение вводит новый тип данных. Даже если два класса имеют одинаковые списки членов, они все равно считаются разными типами:

Пример:

class First {
int memi;
double memd;
};

class Second {
int memi;
double memd;
};

Тело класса определяет отдельную область видимости. Объявление членов внутри тела помещает их имена в область видимости класса. Наличие в двух разных классах членов с одинаковыми именами – не ошибка, эти имена относятся к разным объектам. Подробнее об областях видимости классов мы поговорим позже.

После того как тип класса определен, на него можно ссылаться двумя способами:
1. Написать ключевое слово class, а после него – имя класса.
2. Указать только имя класса.

Данные-члены класса объявляются так же, как переменные. Например, у класса MyClass могут быть следующие данные-члены:

int iDec;
string sSomeString;

Член класса может иметь любой тип:

int topStack;
void (*handler)();
vector stack;

Описанные данные-члены называются нестатическими. Класс может иметь также и статические данные-члены. Об этом позже.

Объявления данных-членов очень похожи на объявления переменных в области видимости блока или пространства имен. Однако их, за исключением статических членов, нельзя явно инициализировать в теле класса:

class First {
int memi = 0; // ошибка
double memd = 0.0; // ошибка
};

Пример использования членов класса вы сможете найти в архиве.
Завтра мы поговорим о конструкторах и деструкторах.

Прикрепления: Ex1.7z (424.8 Kb)


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
eXceed Дата: Четверг, 08.05.2008, 12:49 | Сообщение # 2
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Конструкторы и Деструкторы классов

Если вы писали длинные программы, то знаете, что в некоторых частях программы обычно требуется инициализация. Необходимость инициализации часто еще сильней проявляется при работе с объектами. Для решение этой проблемы в языке C++ присутствуют конструкторы(constructor functions) включаемые в описание класса. Конструкторы класса выполняется каждый раз при создании объекта этого класса. Таким образом инициализация выполняется автоматически.

Конструктор имеет то же имя, что и класс, частью которого он является, и не имеет возвращаемого значения. Пример:

#include <iostream>

using namespace std;

class myclass {
int a;
public:
myclass(); //Конструктор
void show;
};

myclass::myclass()
{
cout << "Это конструктор\n";
a = 10;
}

void myclass::show()
{
cout << a;
}

int main()
{
myclass ob;
ob.show();
return 0;
}

В этом простом примере значение a инициализируется конструктором myclass(). Конструктор выполняется тогда, когда создается объект ob.

Функцией, обратной конструктору объекта, является деструктор (destructor). Эта функция вызывается при удалении объекта. Обычно при работе с объектом в момент его удаления должны выполняется некоторые действия. Например, при создании объекта для него выделяется память, которую необходимо освободить при его удалении. Имя деструктора совпадает с именем класса, но с символом ~(тильда) в начале. Пример класса с деструктором:

#include <iostream>

using namespace std;

class myclass {
int a;
public:
myclass(); //Конструктор
~myclass(); //Деструктор
void show();
};

myclass::myclass()
{
cout << "Constructor\n";
a = 10;
}

myclass::~myclass()
{
cout << "Deleting...\n"; //Desstructor
}

void myclass::show()
{
cout << a << "\n";
}

int main()
{
myclass ob;

ob.show();

return 0;
}

Деструктор класса вызывается при удалении объекта. Локальные объекты удаляются тогда, когда выходят из области видимости. Глобальные объекты удаляются при завершении работы программы. Адреса конструктора и деструктора получить невозможно.

Замечание. Никогда не инициализируйте в конструкторе больше объемы данных!
Пример тут.

Прикрепления: Ex2.7z (413.3 Kb)


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
eXceed Дата: Суббота, 10.05.2008, 14:35 | Сообщение # 3
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Небольшое дополнение к предыдущему сообщению. Конструкторы с параметрами бывают. Для этого необходимо просто добавить аргументы к конструктору. Как в обычной функции вообщем =)

Введение в наследование классов

В C++ наследование - это механизм, посредством которого один класс может наследовать свойства дргого. НАследование позволяет строить иерархию классов, переходя от общих классов к более специальным.

Для начала нужно определить два термина, обычно используемые при обсуждении наследования. Когда один класс наследуется другим, класс который наследуется, называют базовым классом (base class). Наследующий класс называют производным классом (derived class). Обычно процесс наследования начинается с задания базового класса. Базовый класс класс определяет все те качества, которые будут общими для всех производных от него классов.

Пример:

// Определение базового класса
class B
{
int i;
public:
void set_i(int i);
int get_i();
};

Теперь объявим производный класс, наследующий базовый класс:

class D: public B
{
int j;
public
void set_j(int n);
int mul();
};

Внимательно прочтите это еще раз. Обратите внимание, что в имени класса D имеется двоеточие, за которым слудет ключевое слово public и имя класса B. Для компилятора это указание на то, что класс D будет наследовать все компоненты класса B в разделе public(тоесть открытого для всех).
И эти компоненты останутся открыты для всех и в производном классе! Однако все закрытые (private) элементы останутся закрытыми.

Основная форма наследования базового класса:

class имя_производного_класса: список_доступа имя_базового_класса
{
...
...
...
};

Пример реализации:

Прикрепления: Ex3.7z (423.0 Kb)


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
Anteme Дата: Суббота, 24.05.2008, 12:03 | Сообщение # 4
Студент
Группа: Актив
Сообщений: 65
Награды: 0
Статус: Offline
к чему столька букав, когда инфы в интернете навалом и можно просто дать ссылку на нее

и всю оставшуюся жизнь он видел летящий в него кирпич..
 
Expert Дата: Суббота, 24.05.2008, 12:19 | Сообщение # 5
Главный
Группа: Администраторы
Сообщений: 6115
Награды: 1
Статус: Offline
Quote (Anteme)
к чему столька букав, когда инфы в интернете навалом и можно просто дать ссылку на нее

eXceed популяризирует ООП prof и начал он это делать великолепно. Думаю, не стоит мешать.
Я совершенно точно знаю, что уже некоторым форумчанам эта информация очень помогла начать понимать ООП. hands

Насчет ссылок - согласен, их уйма. Но ведь в этом информационном хаосе еще надо уметь ориентироваться... deal

Продолжайте, eXceed, прошу вас. Продолжайте.


Блог декана

Уведомление для прессы и всех пользователей сети интернет: администрация форума может не заметить вовремя нецензурных слов и других, возможно, оскорбительных выражений/картинок/прочих материалов. Если вы заметили косвенный либо прямой факт оскорбления кого бы то ни было, пожалуйста, сообщите об этом администратору форума для принятия решения об удалении/модерировании соответствующего сообщения. Полный текст уведомления см. здесь.
 
vitalyu Дата: Суббота, 24.05.2008, 16:44 | Сообщение # 6
Преподаватель
Группа: СуперАктив
Сообщений: 852
Награды: 0
Статус: Offline
Согласен! Это полезно всем, без исключения, и даже автору, eXceed'у!!!
У нас с ним уже есть опыт преподавания, сам присутствовал как-то на паре у Паши, и считаю его одним из лучших преподавателей happy

Эти статьи прекрасно помогут в изучении азов ООП, не теряя времени на "воду", коей любят разбавлять информацию авторы иных статей и тем более книг. Здесь все пишется для нас, персонально для нас! И цель - не получить выгоду, а желание научить!

Спасибо, уважуха!


Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией.
...
Автомат Калашникова - это средство для превращения стэка в очередь...


Сообщение отредактировал vitalyu - Суббота, 24.05.2008, 16:44
 
eXceed Дата: Суббота, 24.05.2008, 17:02 | Сообщение # 7
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Anteme
Я стараюсь излагать эти вещи доступным для читателя языком. Ориентируясь на то, что в этой теме читатель вообще не знаком с ООП. Конечно сейчас у меня мало времени стало(сессия =\ ), поэтому я редко пишу статьи теперь.
з.ы. имхо статьи написанные простым языком для людей которые особо не разбираются в кодинге и абсолютно не разбирающихся в ООП + простые и наглядные примеры == лучше для читателя, т.к. разобраться проще во всем.

Указатели на объекты

До сих пор мы осуществляли доступ к членам объекта с помощью оператора точка(.). Это верно при работе с объектом. Однако доступ к членам объекта можно получить также и через указатель на этот объект. В этом случае обычно применяется оператор стрелка(->). Аналогичным способом, оператор стрелка (->) используется при работе с указателями на структуру.
Мы объявляем указатель на объект точно так же, как и указатель на переменную любого типа. Задаем имя класса этого объекта, а затем имя переменной со звездочкой перед ним. Для получения адреса объекта перед ним необходим оператор &, точно так же, как это делается для получения адреса переменной другого типа.
Как и для любого другого указателя, если инкрементировать указатель на объект, он будет указывать на следующий объект такого же типа.

Следует обратить внимание

myclass *p;

Создает указатель на объект класса myclass. Это важно для понимания следующего положения: создание указателя на объект не создает объект, оно только создает указатель на него.

Для передачи адреса объекта ob в перменнную p, используется конструкция p = &ob;

Остальное вы увидите в примере.

Прикрепления: Ex4.7z (408.4 Kb)


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
Anteme Дата: Суббота, 24.05.2008, 20:25 | Сообщение # 8
Студент
Группа: Актив
Сообщений: 65
Награды: 0
Статус: Offline
Что же вы все так smile Я же вовсе не против, скорее наоборот. Вполне понимаю, что изложенное это не просто откуда-то скопированное. Это выжатый материал для новичка из тонны подобной инфы

Quote (Expert)
Насчет ссылок - согласен, их уйма. Но ведь в этом информационном хаосе еще надо уметь ориентироваться...

именно поэтому я и написала "можно просто дать ссылку на нее", имела ввиду достойную внимания информацию


и всю оставшуюся жизнь он видел летящий в него кирпич..
 
eXceed Дата: Суббота, 24.05.2008, 22:42 | Сообщение # 9
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Anteme
Я к чему и веду. Лучше вы узнаете это от человека, который программированием зарабатывает на жизнь, чем из какой то мало понятной книжки.


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
vitalyu Дата: Воскресенье, 25.05.2008, 04:58 | Сообщение # 10
Преподаватель
Группа: СуперАктив
Сообщений: 852
Награды: 0
Статус: Offline
Гы. Приложи ту фотку "Пишу на C++ за еду" biggrin

Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией.
...
Автомат Калашникова - это средство для превращения стэка в очередь...
 
eXceed Дата: Воскресенье, 25.05.2008, 13:21 | Сообщение # 11
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
А ведь писал!

Прикрепления: 6923259.jpg (68.8 Kb)


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
Anteme Дата: Воскресенье, 25.05.2008, 17:35 | Сообщение # 12
Студент
Группа: Актив
Сообщений: 65
Награды: 0
Статус: Offline
Quote (vitalyu)
"Пишу на C++ за еду"

cry

даешь каждому сиплюсплюснику по еде!!


и всю оставшуюся жизнь он видел летящий в него кирпич..
 
eXceed Дата: Среда, 25.06.2008, 01:41 | Сообщение # 13
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Лениво писать сейчас про ООП. Поэтому решил написать статью по второй части названия темы.

Введение в библиотеку стандартных шаблонов(STL).

Библиотека STL(Standart Template Library) изначально не являлась частью исходной спецификации языка С++, а была добавлена к нему позже в процессе стандартизации.
Библиотека STL обеспечивает стандартные(общецелевые) классы и функции, которые реализуют наиболее популярные и широко используемые алгоритмы и структуры данных. Хочу заметить, что синтаксис STL изначально выглядит пугающе, т.к. в нем используются самые изощренные свойства языка С++.

Ядро библиотеки образует три основополагающих элементов: Контейнеры, Алгоритмы, Итераторы.

Контейнер - это объекты, предназначенные для хранения других объектов. Контейнеры бывают различных типов. Например vector(вектор) определяющий динамический массив. Контейнер quene(очередь) определяющий очередь объектов. Контейнер list(список) определяющий список объектов. Дополнительно существуют ассоциативные контейнеры, позволяющие быстро получать значения при помощи ключей(keys).
Каждый класс - контейнер определяет набор функций для работы с этим контейнером. Например, список содержит функции вставки, удаления и слияния(merge) элементов.

Алгоритмы выполняют операции над содержимым контейнеров. Существуют алгоритмы сортировки, инициализации и етц. Многие алгоритмы предназначены для работы с последовательностями, которая представляет собой линейный список элементов внутри контейнера.

Итераторы - это объекты, которые по отношению к контейнерам играют роль указателей. Они позволяют получить доступ к содержимому контейнера.
Итераторы бывают: произвольного доступа, двунаправленные, однонаправленные, ввода, вывода.

Начнем с изучения вектора(vector).

Вероятно vector самый популярный контейнер библиотеки STL. По сути он собой представляет динамический массив.
Спецификация шаблона vector:

Code
template<class T, class Allocator = allocator<T>>class vector

Где T - тип предназначенных для хранения данных. Allocator задет распределитель памяти, который по умолчанию является стандартным распределителем.
Хотя синтаксис шаблона выглядит сложным, то на практике все гораздо проще.
Code

vector<int> iv; //Создает вектор нулевой длинны для целых чисел
vector<char> cv(5); //Создает вектор из пяти элементов для символов
vector<char> cv(5, 'x'); //Создание и инициализация вектора из пяти элементов
vector<int> iv2(iv); //Создание вектора для целых чисел из вектора для целых чисел

Для класса вектор определены следующие операторы сравнения: ==, <, <=, !=, >, >=
Дополнительно определяется оператор индекса [], что обеспечивает произвольный доступ к членам вектора.

Список функций класса vector очень велик и поэтому вам следует обратиться к документации в msdn. Я лишь перечислю самые основные функции.
Наиболее важные функции: size(), begin(), end(), push_back(), insert(), erase(). Почти все функции возвращают в качестве значение итераторы.
В примере вы увидите как эта машина STL работает.
Пример ниже. Убедительно прошу читать внимательно коментари! В следующий раз я покажу как работать с итераторами.

Прикрепления: Ex5.7z (352.8 Kb)


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
eXceed Дата: Четверг, 26.06.2008, 23:24 | Сообщение # 14
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Жаль, что лишь один человек изредка обращает внимание на этот раздел. А ведь ПиЭшники и КЗОИшники должны уметь программировать! И не имеет значения Delphi это или C++. По большей части я ведь даю универсальную базу применимую и в Delphi и в C++! Если вы делаете АРМ или АСУ - архитектурные изыски должны использоваться в полной мере. Когда я не знал этих вещей, для меня большая программа казалось непостижимо сложной! Но дальше я узнал о паттернах, архитектурах и етц. Жить стало легче и проще. Я шагнул на новый уровень. И вам дорогие студенты и преподаватели рекомендую читать, комментировать и задавать вопросы. Линейщики и ООПкуны(Дельфины использующие ООП вслепую. Привет VCL) не подозревают, что теряют...

bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
vitalyu Дата: Пятница, 27.06.2008, 02:26 | Сообщение # 15
Преподаватель
Группа: СуперАктив
Сообщений: 852
Награды: 0
Статус: Offline
На самом деле, я вот все жду, когда ты свою книгу выпустишь smile Читать реально интересно smile
Я хоть и не отписываю, но читаю постоянно happy
Возможно, и др. также ..

ООП - мощь, и никакое не будущее, а настоящее .. Поэтому не знать сие (и не хотеть знать) - позор программисту wink


Бог сумел сотворить мир всего за 6 дней только потому, что ему не нужно было решать проблемы совместимости с предыдущей версией.
...
Автомат Калашникова - это средство для превращения стэка в очередь...
 
eXceed Дата: Пятница, 27.06.2008, 02:54 | Сообщение # 16
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Продолжаем изучать контейнер vector. Сегодня я покажу как использовать итераторы.

Как вы должны знать уже, что в С++ массивы и указатели очень тесно связаны. Доступ к массиву можно получать либо через оператор индекса, либо через указатель. По аналогии с этим, в библиотеке STL имеется тесная связь между векторами и итераторами. Доступ к членам вектора можно получить либо через оператор индекса, либо через итератор. В примере показаны оба подхода.

Code
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    int i;
    vector<int>::iterator p = v.begin(); //Объявление итератора указывающего на начало вектора

    //Помещение значений в вектор
    for (i = 0; i < 10; i++)
    {
     v.push_back(i);
    }
    //Доступ к содержимому вектора с использованием оператора индекса
    for (i = 0; i < 10; i++)
    {
     cout << v[i] << " " << endl;
    }
    //Доступ к вектору через итератор
    while (p != v.end())
    {
     cout << *p << " ";
     p++;
    }

    return 0;
}

В результате выполнения на экране появится следующие:

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

Обратите внимание на объявление итератора p. Тип итератора должен соответствовать классу контейнера, где итератор предпологается использовать.

Так же советую посмотреть пример в аттаче к посту. В этом примере вектор используется для хранения объектов класса, определенного мною. Обратите внимание, что в класса определяется конструктор по умолчанию и перегруженные версии операторов < и ==. Пример сделан для демонстрации возможности перегрузки операторов и хранения в контейнерах типа vector не только численных значений, но и других объектов.
В следующей статье я объясню возможности языка по перегрузке, в том числе и по перегрузке операторов. Это одна из "фишек" языка C++ и ООП в целом.
з.ы. Помните, в зависимости от того, как реализована библиотека STL для компилятора, вам может понадобится определить и другие операторы сравнения.

Прикрепления: Ex6.7z (355.7 Kb)


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
 
Expert Дата: Пятница, 27.06.2008, 06:41 | Сообщение # 17
Главный
Группа: Администраторы
Сообщений: 6115
Награды: 1
Статус: Offline
Quote (vitalyu)
На самом деле, я вот все жду, когда ты свою книгу выпустишь

Хорошая идея. Выпустить книгу в одной из типографий С-ра ~ 10 000 р. тиражом ~ 100. Можем скинуться.

Quote (vitalyu)
Читать реально интересно

+1

Quote (vitalyu)
Я хоть и не отписываю, но читаю постоянно

аналогично


Блог декана

Уведомление для прессы и всех пользователей сети интернет: администрация форума может не заметить вовремя нецензурных слов и других, возможно, оскорбительных выражений/картинок/прочих материалов. Если вы заметили косвенный либо прямой факт оскорбления кого бы то ни было, пожалуйста, сообщите об этом администратору форума для принятия решения об удалении/модерировании соответствующего сообщения. Полный текст уведомления см. здесь.
 
eXceed Дата: Понедельник, 06.04.2009, 11:47 | Сообщение # 18
Профессор
Группа: СуперАктив
Сообщений: 5788
Награды: 0
Статус: Offline
Не стал открывать новую тему. Но данный вопрос очень важен для программистов в связи с подходящими сроками сдачи курсовой по Криптографии. Тем кто пишет в стиле party hard и ООП во все поля, читать в первую очередь.

Динамическая идентификация типов

Динамическая идентификация необходима для однозначной идентификации типа данных. Чаще всего возникает необходимость в этом когда на этапе выполнения программы тип данных не известен. Характерно для языков поддерживающих полиморфизм. Например C++ или Delphi.

Информацию об объекте получают с помощью оператора typeid(описан в <typeinfo>). Синтаксис: typeid(объект). Здесь объект - это тот объект информацию о типе которого нужно получить. Оператор typeid() возвращает ссылку на на объект типа type_info, который и будет описывать тип объекта объект. Хочу заметить, что typeid может идентифицировать любые типы и объекты.

Пример использования.

Например есть два класса рожденных от BaseClass который имеет virtual void f() - делает BaseClass полиморфным.

Derived1: public BaseClass и Derived2: public BaseClass.

int i; Derived1 ob1; Derived2 ob2; BaseClass *p, baseob;

Вывод на экран встроенного типа данных.

cout << "Тип переменной i - это" << typeid(i).name() <<endl;

Обработка полиморфных объектов.

p = &baseob;

cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;

p = &ob1;

cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;

p = &ob2;

cout << "Указатель p указывает на объект типа " << typeid(*p).name() << endl;

В результате на экране увидим.

Тип переменной i - это int
Указатель p указывает на объект типа BaseClass
Указатель p указывает на объект типа Derived1
Указатель p указывает на объект типа Derived2

В том числе возможно использование typeid и в перегруженных конструкциях. Метод работы не отличается.

Динамическое приведение типов данных.

Кроме стандартного приведения типов возможны приведения типов объектов. Далее рассмотрим работу dynamic_cast. Для начала рассмотрим его, т.к. он имеет прямое отношение к динамической идентификации типов.

Оператор dynamic_cast реализует приведение типов в динамическом режиме, что позволяет контролировать правильность приведения типа в "реалтайме". Если приведение типов не произойдет при помощи dynamic_cast то возникнет исключительная ситуация(или просто ошибка приведения)

Основная форма каста: dynamic_cast<целевой тип>(выражение). Рассмотрим простой пример.

Предположим, что Base - это базовый класс, а Derived - это класс, производный от Base.

Base *bp, b_ob;
Derived *dp, d_ob;

bp = &d_ob; //Указатель базового класса указывает на объект производного класса.

dp = dynamic_cast<Derived *>(bp)
if(!dp) cout "Приведение прошло успешно";

Здесь приведение типа указателя bp базового класса к типу указателя dp производного класса прошло успешно, поскольку указатель bp на самом деле указывает на объект производного класса Derived. Однако в следующем примере произойдет ошибка, поскольку указатель bp указывает на объект базового класса Base, а приводить тип объекта базового класса к типу объекта произвольного класса - неправильно.

bp = &b_ob;

dp = dynamic_cast<Derived *>(bp);
if(!dp) cout "Приведения типов не произошло";

В некоторых случаях dynamic_cast можно использовать вместо typeid. Об этом и статических кастах поговорим чуть позже. А пока я буду наслаждаться ароматным зеленым чаем.


bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.

Сообщение отредактировал eXceed - Понедельник, 06.04.2009, 11:49
 
lamama Дата: Вторник, 07.04.2009, 20:58 | Сообщение # 19
Заведующий кафедрой
Группа: Модераторы
Сообщений: 524
Награды: 0
Статус: Offline
Quote (eXceed)
Жаль, что лишь один человек изредка обращает внимание на этот раздел. А ведь ПиЭшники и КЗОИшники должны уметь программировать!

respect
Недавно один студент пытался пересдать дисциплину "Язык программирования Си". Его попросили написать 3 простых програмки, в том числе программа вывода текста "Hellow, world!". Результат - uhm . ТАКИЕ студенты нам не нужны, как это обидно не звучит.


Не оседать, не приживаться -
Ступенька за ступенькой - без печали,
Шагать вперед, идти от дали к дали,
Все шире быть, все выше подниматься.
 
Max-off Дата: Вторник, 07.04.2009, 21:48 | Сообщение # 20
Студент
Группа: Актив
Сообщений: 67
Награды: 0
Статус: Offline
Quote (eXceed)
Жаль, что лишь один человек изредка обращает внимание на этот раздел. А ведь ПиЭшники и КЗОИшники должны уметь программировать!

Выпускники ПИЭ - это не кодеры, не программисты. Это внедренцы УПП иже сними системы или люди которые обслуживают эти вещи.
 
Факультет ИСиТ СыктГУ - Форум » Компьютеры / Интернет / Информационные системы и технологии » Программирование » ООП для самых маленьких (Основы ООП и библиотеки STL)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:



Copyright bda-expert.ru © 2008-2024Хостинг от uCoz