Форум программистов, компьютерный форум CyberForum.ru

Двойная диспетчеризация :) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Матрица переходов. Транслятор http://www.cyberforum.ru/cpp-beginners/thread823445.html
Здравствуйте! Пишу курсовик (транслятор с языка С на язык ASM). Подскажите пожалуйста как правильно пользоваться сей вещью (матрица переходов), ибо в методичке ничего толкового не написано. Список лексем получил, а что дальше делать ;)? Добавлено через 41 минуту Если конкретнее то нужно рассказать про "Матрицу переходов конечного автомата". Ещё непонятно какие состояния нужно брать и...
C++ Вывод результата нажатием кнопки Esc Не буду писать условие задачи, проблема заключается в том, что при нажатии клавиши Ecs, необходимо выводить результат работы программы. Полагаю, что нужно использовать оператор getche(), только я не знаю, есть ли какой-то символ для клавиши Ecs, как у Enter, к примеру? Добавлено через 25 минут Разобрался сам :) http://www.cyberforum.ru/cpp-beginners/thread823439.html
Является ли граф деревом C++
Суть задачи заключается в том, что нужно проверить граф, является ли он деревом. Граф является деревом, если граф - связный и в графе отсутствуют циклы. Проверку на связность я осуществляю с помощью поиска в глубину. Вопрос заключается в том, как мне "написать" проверку на циклы? В просмотренной литературе ничего подходящего найти не могу, либо написано сложно для понимая: векторы и т.д. Надеюсь...
массив структур C++
Написать функцию для создания массива записей со сведениями о студентах (ФИО, возраст, курс, успеваемость). По заданному массиву определить средний бал успеваемости студентов n курса.
C++ Текстовые и бинарные файлы. Получить файл g из чисел исходного файла http://www.cyberforum.ru/cpp-beginners/thread823423.html
Компоненты файла f – целые числа, положительных чисел столько же, сколько отрицательных. Получить файл g из чисел исходного файла, в ко-тором не было бы двух соседних чисел с одинаковым знаком.
C++ Как преобразовать long double в char[]? Приветствую. Подскажите пожалуйста, как преобразовать long double в в тип char? До указателей по книге еще не дошел, в интернете пытался найти функцию, так и не разобрался. Самое интересное что в книге об этом ничего не сказано, зато задание есть такое. Плюсану на спасибо за ответ. подробнее

Показать сообщение отдельно
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
31.03.2013, 13:00     Двойная диспетчеризация :)
Есть хороший пример на графических примитивов в каком-нибудь векторном графическом редакторе. Допустим, есть общий предок Shape, от которого наследуются Circle, Square и Triangle (круг, квадрат, треугольник). Нам надо уметь определить площадь пересечения двух фигур. Очевидно, математика такого пересечения зависит от того, какие именно фигуры пересекаются. Но вот сам рисунок представлен в виде коллекции указателей на Shape, где мы можем выбрать произвольно два объекта и поинтересоваться площадью их пересечения. Вот тут-то и вступает в дело двойная диспетчеризация:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Circle;
class Triangle;
class Square;
 
class Shape {
public:
    virtual double getIntersection(const Shape& other) const = 0;  // Функция, которая вызывается для определения площади пересечения
    // Эти функции вычисляют площадь пересечения с конкретной фигурой
    // Для ясности к именам добавлена буква, идентифицирующая класс,
    // но на самом деле необходимости в ней нет, компилятор сориентируется по типам ссылок
    virtual double getIntersectionC(const Circle& c) const = 0;
    virtual double getIntersectionT(const Triangle& t) const = 0;
    virtual double getIntersectionS(const Square& s) const = 0;
};
 
class Circle: public Shape {
public:
    virtual double getIntersection(const Shape& other) const
    {
        return other->getIntersectionС(*this);  // Разворачиваем вызов, надёжно идентифицируя себя как круг
    }
 
    // Реализуем вычисление площади, зная тип нашей фигуры (круг) и второй фигуры
    virtual double getIntersectionC(const Circle& c) const;
    virtual double getIntersectionT(const Triangle& t) const;
    virtual double getIntersectionS(const Square& s) const;    
};
 
// Классы Triangle и Square реализуются аналогично
 
// Получим площадь пересечения фигур, зная их имена
double getIntersectionByNames(const Drawing& drawing, const string& name1, const string& name2)
{
    const Shape& shape1 = Drawing.getByName(name1); // Допустим, это Triangle
    const Shape& shape2 = Drawing.getByName(name2); // Допустим, это Circle
    return shape1.getIntersection(shape2);  // будет вызвана виртуальная функция Triangle::getIntersection, которая
    // в свою очередь вызовет у shape2 виртуальный метод Circle::getIntersectionT
}
 
Текущее время: 04:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru