6 / 6 / 0
Регистрация: 20.04.2009
Сообщений: 29
|
|
1 | |
Работа с виртуальными функциями13.01.2010, 22:11. Показов 4033. Ответов 44
Метки нет (Все метки)
Доброго времени суток, форумчани! Помогите мне, пожалуйста, с задачей, у меня просто нет этой темы, а сдать нужно обязательно
Напишите, пожалуйста, хотя бы классы в общих чертах, как использовать виртуальную функцию? Вот моё задание: Создать абстрактный базовый класс с виртуальной функцией - площадь поверхности. Создать производные классы: параллелепипед, тетраэдр, шар со своими функциями площади поверхности. Для проверки определить массив ссылок на абстрактный класс, которым присваиваются адреса различных объектов. Площадь поверхности параллелепипеда: S=6*x*y. Площадь поверхности шара: S=4*pi*r*r. Площадь поверхности тетраэдра: S=a*a*sqrt(3). Заранее очень-очень-…-очень благодарю!!!
0
|
13.01.2010, 22:11 | |
Ответы с готовыми решениями:
44
Проблема с виртуальными функциями Задачка с наследованием и виртуальными функциями Классы с виртуальными функциями. Class Student Неправильный вывод при работе с виртуальными функциями |
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
||||||
13.01.2010, 23:12 | 2 | |||||
Раз у тебя репутация есть, значит напившись программу сам, здесь приведен только пример
показывающий как пользоваться поздним связыванием, полиморфизмом и виртуальными функциями. Надеюсь,я вам помог.
1
|
13.01.2010, 23:35 | 3 |
Genius Ignat, если твой пример отобразить на поставленную задачу, то в производных классах при описании функции f слово virtual уже не нужно. Чисто с концептуальной точки зрения с точки зрения площади поверхности функция площади не может быть переопределена даже если мы от класса, например "шар", создадим производные классы "синий шар" и "зелёный шар"
Это так, чисто ремарка
1
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
14.01.2010, 10:48 | 4 |
Evg, я не программлю как в учебниках учат и я этому рад, а если хочешь узнать зачем,
virtual в производных классах писать читай, что такое COM. Добавлено через 4 минуты Не если, я не в тему задачи, пусть кто-нибудь меня подправит. Я просто показал основную фишку C++, между прочим sto.r.m и ее еще не знает.
0
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
14.01.2010, 12:30 | 7 |
Evg:
Моя цель была, показать синтаксис, а не решать задачу. Evg: Если хочешь напиши сам, поставленную задачу, если тебе не нравится virtual в производных убирай, мне все равно. Про причины наличия виртуальные функций в производных отвечать не буду. Написано значит написано, тому были причины.
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
14.01.2010, 12:41 | 8 |
угу. оно не нужно. но для удобства чтения его лучше писать. чтобы долго не думать - виртуальная ли функция это или обычная.
Genius Ignat, ты забыл в базовом классе виртуальный деструктор определить.
0
|
14.01.2010, 14:35 | 9 | ||||||||||
Тебе это не даёт ровным счётом ничего, потому как ты не знаешь, виртуальная функция была в базовом классе, или нет (т.е. виртуальность начинается на уровне нашего класса или началась где-то выше по иерархии классов). Сделай в данном примере в базовом классе функцию f НЕвиртуальной (и определи её). Ты увидишь, что в производных классах функция f помечена как virtual, однако все вызовы pMas[i]->f(); вызывают функцию базового класса, а не производного
В этом случае надо менять код
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
14.01.2010, 14:49 | 10 |
логично, что будет вызываться функция базового класса. ведь вызов функции идёт через указатель на базовый класс. а раз функция НЕ виртуальная - то она и вызывается (поиск по vtable не идёт).
0
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
||||||
14.01.2010, 14:56 | 11 | |||||
zim22:
В абстрактных классах представляющих из себя интерфейсы, не нужны конструкторы, и деструкторы В производных деструкторы, нужны не спорю, ну забыл приписать, ты посмотри на время, когда был пост с примером: спать хотелось. исправлюсь:
Почитайте лучше: http://it-books.narod.ru/COM/InsideCOM_rus.rar И хватит спорить, в этой книге, написано и про определения типа во время выполнения, и про полиморфизм. По крайней мере, лучшего объяснения, и примеров я не видел, тем более в этой книге есть нечто большее, чем просто виртуальные функции конструкторы и деструкторы, про которые все так усердно спорят
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
14.01.2010, 15:00 | 12 |
если базовый класс содержит вирт.функции, то у него должен быть виртуальный деструктор.
тело которого будет определено вне класса. в производных - можно и без деструкторов обойтись. в таком случае будут вызываться деструкторы базового класса.
0
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
14.01.2010, 15:03 | 13 |
Жесть:
Спорить не буду, пусть каждый будет при своем мнении, ну книгу лучше почитай.
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
14.01.2010, 15:08 | 14 |
такого не бывает, что все мнения - верны.
кто-то ошибается: или ты, или я. я не ошибаюсь в данном случае с вероятностью 73% у меня на винте список из порядка 100 книг валяется по С++/алгоритмам/т.д. так мне что тоже говорить тебе, чтобы ты их все прочитал? давай уже до правды докапываться. в чём я ошибаюсь с твоей точки зрения?
0
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
14.01.2010, 15:10 | 15 |
Надеюсь автор темы, её закроет.
Иначе будет бесконечный апельсин. Добавлено через 1 минуту Книгу скачай там узнаешь, Если автор книги ошибается, тогда я не причём.
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
|
14.01.2010, 15:17 | 16 |
0
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
14.01.2010, 15:27 | 17 |
Ща поищем
Добавлено через 1 минуту стр.27 Добавлено через 7 минут zim22: по дружески скажи, где в опциях форума можно найти, что бы в моих ответах ставилась, кнопка "спасибо"
0
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
||||||
14.01.2010, 15:29 | 18 | |||||
в примере в книге не был определён виртуальный деструктор в базовых классах-интерфейсах потому-что удаление объекта класса CA велось напрямую, а не через указатель на его базовый класс.
*** вот сорс-код из книги
0
|
14.01.2010, 15:31 | 19 |
Ты утверждал, что в проиводном классе нужно функцию описывать как виртуальную (типа, чтобы глазами лучше зацепить факт виртуальности). Я тебе показал конкретный пример, а так же объяснил, почему тебе это ВООБЩЕ ничего не даст
Если ты пишешь деструкторы в производных классоах (но асбтрактный оставляешь без деструктора), то удалять (delete) объекты производного класса можно только через указатель производного класса. А вот если ты в базовом классе опишешь деструктор, что ты сможешь удалять объект через указатель на базовый класс. В этом-то и есть весь прикол. Производный класс тебе нужен только в момент создания объекта, после чего ты указатель на производный класс преобразуешь в указатель на базовый класс и вообще напрочь забываешь про проивзодный класс. В этом и есть мощь механизма виртуальных функций (а так же ООП, о чём говорилось в одной из соседних тем). Зачем отсылать людей к какой-то книге. Тебе конкретно в твоём примере показали недочёты, которые уже сами по себе говорят о том, что тебе не мешало бы почитать про ООП (не путать с "прочитать учебник по Си++") Необязательно. Правда в этом случае будет "программирование через классы", а не "ООП". Тело виртуального деструктора необязательно определать вне класса (т.е. на вскидку я не вижу ни одной причины, почему должно быть иначе) Если ты удаляешь объект производного класса (как сделано в примере), то деструктор базового класса тоже вызовется. Независимо от того,описан он в проивзодном классе, или нет. Но это тоже чисто ремарка, поскольку указанный пример уже не является примером ООП в силу указанных ошибок
0
|
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
14.01.2010, 15:31 | 20 |
Дальше книгу почитай, от указателя ни чего не зависит.
0
|
14.01.2010, 15:31 | |
14.01.2010, 15:31 | |
Помогаю со студенческими работами здесь
20
Реализовать абстрактный класс pair c виртуальными арифметическими функциями Создать абстрактный базовый класс с виртуальными функциями - площадь и периметр Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |