Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
sto.r.m
6 / 6 / 1
Регистрация: 20.04.2009
Сообщений: 29
#1

РАБОТА С ВИРТУАЛЬНЫМИ ФУНКЦИЯМИ - C++

13.01.2010, 22:11. Просмотров 2658. Ответов 44
Метки нет (Все метки)

Доброго времени суток, форумчани! Помогите мне, пожалуйста, с задачей, у меня просто нет этой темы, а сдать нужно обязательно
Напишите, пожалуйста, хотя бы классы в общих чертах, как использовать виртуальную функцию?

Вот моё задание:
Создать абстрактный базовый класс с виртуальной функцией - площадь поверхности. Создать производные классы: параллелепипед, тетраэдр, шар со своими функциями площади поверхности. Для проверки определить массив ссылок на абстрактный класс, которым присваиваются адреса различных объектов.
Площадь поверхности параллелепипеда: S=6*x*y. Площадь поверхности шара: S=4*pi*r*r. Площадь поверхности тетраэдра: S=a*a*sqrt(3).



Заранее очень-очень-…-очень благодарю!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2010, 22:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос РАБОТА С ВИРТУАЛЬНЫМИ ФУНКЦИЯМИ (C++):

Проблема с виртуальными функциями - C++
Привет. Столкнулся с небольшой проблемой, касательно виртуальных функций. Стыдно спрашивать, ибо это нечто элементарное. Просто я уже...

Задачка с наследованием и виртуальными функциями - C++
Диаграмма классов на приложенном рисунке. #include <iostream> class IData { public: virtual ~IData() = 0 {} virtual...

Классы с виртуальными функциями. Class Student - C++
Создать класс Студент со свойствами: ФИО, Факультет, Курс, минималь- ная оценка по экзаменам за последнюю сессию (по 5-ти бальной...

Неправильный вывод при работе с виртуальными функциями - C++
В общем, учу плюсы по книге Праты. Там есть одно задание по виртуальным функциям. Но дело сейчас не в них. У меня есть базовый (Cd) и...

Создать абстрактный базовый класс с виртуальными функциями - площадь и периметр - C++
Помогите написать,не врублюсь как писать много пропустил (( Задание:Создать абстрактный базовый класс с виртуальными функциями - площадь ...

Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания - C++
Здравствуйте, помогите пожалуйста разобраться что как работает в программе (напишите комментарии). Задание: Создать базовый класс...

44
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
14.01.2010, 15:17 #16
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Книгу скачай там узнаешь,
у меня нет времени читать всю книгу. на какой странице я это узнаю?
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
14.01.2010, 15:27 #17
Ща поищем

Добавлено через 1 минуту
стр.27

Добавлено через 7 минут
zim22: по дружески скажи, где в опциях форума можно найти, что бы в моих ответах ставилась,
кнопка "спасибо"
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
14.01.2010, 15:29 #18
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Ща поищем
стр.27
в примере в книге не был определён виртуальный деструктор в базовых классах-интерфейсах потому-что удаление объекта класса CA велось напрямую, а не через указатель на его базовый класс.
***
вот сорс-код из книги
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#define interface struct
#include <iostream.h> 
#include <objbase.h>   // Определить интерфейс 
 
void trace(const char* pMsg) { cout << pMsg << endl; } 
 
// Абстрактные интерфейсы 
interface IX 
{ 
  virtual void __stdcall Fx1() = 0; 
  virtual void __stdcall Fx2() = 0; 
}; 
 
interface IY 
{ 
  virtual void __stdcall Fy1() = 0; 
  virtual void __stdcall Fy2() = 0; 
}; 
 
// Реализация интерфейса 
class CA : public IX,  
           public IY 
{ 
public: 
 
 // Реализация интерфейса IX 
  virtual void __stdcall Fx1() { cout << "CA::Fx1" << endl; } 
  virtual void __stdcall Fx2() { cout << "CA::Fx2" << endl; } 
 
 // Реализация интерфейса IY 
  virtual void __stdcall Fy1() { cout << "CA::Fy1" << endl; } 
  virtual void __stdcall Fy2() { cout << "CA::Fy2" << endl; } 
 
}; 
 
 
// Клиент 
int main() 
{ 
 trace("Клиент: Создание экземпляра компонента"); 
  CA* pA = new CA; 
 
  // Получить указатель IX 
  IX* pIX = pA; 
 
 trace("Клиент: Использование интерфейса IX"); 
 pIX->Fx1(); 
 pIX->Fx2(); 
 
  // Получить указатель IY 
  IY* pIY = pA; 
 
 trace("Клиент: Использование интерфейса IY"); 
 pIY->Fy1(); 
 pIY->Fy2(); 
 
 trace("Клиент: Удаление компонента"); 
 delete pA; 
 
 return 0; 
}
0
Evg
Эксперт CАвтор FAQ
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
14.01.2010, 15:31 #19
Цитата Сообщение от zim22 Посмотреть сообщение
логично, что будет вызываться функция базового класса. ведь вызов функции идёт через указатель на базовый класс. а раз функция НЕ виртуальная - то она и вызывается (поиск по vtable не идёт).
Ты утверждал, что в проиводном классе нужно функцию описывать как виртуальную (типа, чтобы глазами лучше зацепить факт виртуальности). Я тебе показал конкретный пример, а так же объяснил, почему тебе это ВООБЩЕ ничего не даст

Цитата Сообщение от Genius Ignat Посмотреть сообщение
В абстрактных классах представляющих из себя интерфейсы, не нужны конструкторы, и деструкторы
В производных деструкторы, нужны не спорю
Если ты пишешь деструкторы в производных классоах (но асбтрактный оставляешь без деструктора), то удалять (delete) объекты производного класса можно только через указатель производного класса. А вот если ты в базовом классе опишешь деструктор, что ты сможешь удалять объект через указатель на базовый класс. В этом-то и есть весь прикол. Производный класс тебе нужен только в момент создания объекта, после чего ты указатель на производный класс преобразуешь в указатель на базовый класс и вообще напрочь забываешь про проивзодный класс. В этом и есть мощь механизма виртуальных функций (а так же ООП, о чём говорилось в одной из соседних тем).

Цитата Сообщение от Genius Ignat Посмотреть сообщение
Почитайте лучше:
http://it-books.narod.ru/COM/InsideCOM_rus.rar
И хватит спорить, в этой книге, написано и про определения типа во время выполнения,
и про полиморфизм.
По крайней мере, лучшего объяснения, и примеров я не видел, тем более в этой книге
есть нечто большее, чем просто виртуальные функции конструкторы и деструкторы, про
которые все так усердно спорят
Зачем отсылать людей к какой-то книге. Тебе конкретно в твоём примере показали недочёты, которые уже сами по себе говорят о том, что тебе не мешало бы почитать про ООП (не путать с "прочитать учебник по Си++")

Цитата Сообщение от zim22 Посмотреть сообщение
если базовый класс содержит вирт.функции, то у него должен быть виртуальный деструктор.
тело которого будет определено вне класса.
Необязательно. Правда в этом случае будет "программирование через классы", а не "ООП". Тело виртуального деструктора необязательно определать вне класса (т.е. на вскидку я не вижу ни одной причины, почему должно быть иначе)

Цитата Сообщение от zim22 Посмотреть сообщение
в производных - можно и без деструкторов обойтись. в таком случае будут вызываться деструкторы базового класса.
Если ты удаляешь объект производного класса (как сделано в примере), то деструктор базового класса тоже вызовется. Независимо от того,описан он в проивзодном классе, или нет. Но это тоже чисто ремарка, поскольку указанный пример уже не является примером ООП в силу указанных ошибок
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
14.01.2010, 15:31 #20
Дальше книгу почитай, от указателя ни чего не зависит.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.01.2010, 15:42 #21
Genius Ignat, я читал эту книгу, дважды.
Это не книга по ООП. Не стоит основываться на нее, когда ты говоришь про полиморфизм, инкапсуляцию и т.п.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
14.01.2010, 15:43 #22
Цитата Сообщение от Evg Посмотреть сообщение
Я тебе показал конкретный пример, а так же объяснил, почему тебе это ВООБЩЕ ничего не даст
ну а вот другой пример, в котором факт виртуальности имеет значение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Base {
  void fcn() { }
};
 
struct Derived : Base {
  virtual void fcn() { }    // имеет значение :)
};
 
struct TheMostDerived : Derived {
  void fcn() { }
};
 
int main()
{
  Base *ptr = new Derived;
  ptr->fcn(); // Base::fcn
 
  Derived *dp = new TheMostDerived;
  dp->fcn(); // TheMostDerived::fcn
 
  return 0;
}
Цитата Сообщение от Evg Посмотреть сообщение
Тело виртуального деструктора необязательно определать вне класса (т.е. на вскидку я не вижу ни одной причины, почему должно быть иначе)
я ошибся. тело чистого виртуального деструктора должно быть определено вне класса.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.01.2010, 15:47 #23
Цитата Сообщение от zim22 Посмотреть сообщение
ну а вот другой пример, в котором факт виртуальности имеет значение
zim22, Evg говорил тебе немного о другом. Факт наличия слова virtual в объявлении методов производных классов не дает никакой информации для читателя. Т.к. без исследования иерархии классов непонятно, в каком базовом классе появился данный виртуальный метод.
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
14.01.2010, 15:52 #24
Чувствую спор закончится, тогда:
Когда будет рассказано что такое конструктор, когда он вызывается, как он вызывается,
кого он вызывает, как деструктор, вызывает другой деструктор, потом начнутся разговоры,
про динамическое определение типа, потом про vtbl.
Глядишь так и книга по C++ появится

Добавлено через 3 минуты
zim22 Evg: Давайте общими усилиями книгу напишем.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.01.2010, 15:53 #25
Genius Ignat, просто не стоит приводить в пример книгу, которая не относится к рассматриваемой теме, даже если она тебе очень очень понравилась.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
14.01.2010, 15:55 #26
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Т.к. без исследования иерархии классов непонятно, в каком базовом классе появился данный виртуальный метод.
может быть и не понятно в каком базовом классе впервые был определён этот виртуальный метод, но явно написав слово virtual мы тем самым сообщаем разработчику, что мы будем не скрывать одноимённый метод базового класса, а будем его переопределять.
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Чувствую спор закончится, тогда:
Когда будет рассказано что такое конструктор
похоже что все в этой теме кроме тебя это всё уже и так знают.
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.01.2010, 15:59 #27
Цитата Сообщение от zim22 Посмотреть сообщение
явно написав слово virtual мы тем самым сообщаем разработчику, что мы будем не скрывать одноимённый метод базового класса, а будем его переопределять
Вот с этого места поподробнее. Если наличие или отсутствие слова virtual в производном классе ни на что не влияет, то каким образом его наличие будет говорить, что мы будем не скрывать одноимённый метод базового класса, а будем его переопределять?
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
14.01.2010, 16:09 #28
zim22: зачем так не хорошо.

Добавлено через 7 минут
Все наши споры вводят: sto.r.m в заблуждение у него и так темы про виртуальые функции нет.
А Я, CyBOSSeR, zim22 и Evg о чём-то спорим, в книгах же нет споров,
поэтому я выключаюсь из дискуссии.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
14.01.2010, 16:13 #29
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
каким образом его наличие будет говорить, что мы будем не скрывать одноимённый метод базового класса, а будем его переопределять?
перед тем, как создать свой производный класс, в котором и будем явно писать слово vritual, мы посмотрим на объявление функций из класса, от которого будем наследоваться. и если в нём тоже в функции есть слово virtual - мы сохраняем этот code-style и в нашей, переопределяемой функции тоже его явно напишем. плюсы в том, что мне достаточно посмотреть всего-лишь на "внутренности" одного класса - родителя, а не искать по всей иерархии наследования точный тип функции(virtual или нет), которую я хочу переопределить.
0
Evg
Эксперт CАвтор FAQ
18370 / 6417 / 441
Регистрация: 30.03.2009
Сообщений: 17,803
Записей в блоге: 28
14.01.2010, 16:15 #30
zim22, в посте #3 я так же оптисался по поводу слова "virtual" для примера из ПОСТАВЛЕННОЙ ЗААЧИ. Т.е. у тебя есть базовый класс "фигура" с абстрактным виртуальным методом "площадь", от него наследуем класс "фигура шар", в котором переопределяем метод "площадь" (которая действительно для шара). Здесь я написал, что метод "фигура_шар::площадь" НЕ должен быть виртуальным, т.к. если мы пойдём наследовать дальше типа "фигура шар зелёный", то метод "площадь" меняться не делжен, ибо площать - это свойство шара, но НЕ свойство дальнейших модификаций шара по цепочке наследования

Genius Ignat, с тобой спорить бесполезно (я бы даже сказал, не интересно). Ты совершенно не пытаешься вникнуть в то, о чём тебе гокорят и всё время как-то асбтрактно ссылаешь на какие-то книги и посылаешь всех читать. Абсолютно никакой конкретики. Взять хотябы фразу из 20-го поста, сказанную с умным видом "от указателя ни чего не зависит" - я так и не понял, о чём ты говоришь. Зато понял то, что ты мой пост либо читал через строку, либо не осилил, а потому и отбрыкнулся короткой невнятной фразой
0
14.01.2010, 16:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2010, 16:15
Привет! Вот еще темы с ответами:

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями - C++
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким условием: Создать абстрактный базовый класс Тройка чисел с...

Работа с функциями - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include&lt;CONIO.H&gt; #include&lt;STDIO.H&gt; #include &lt;time.h&gt; #include &lt;stdlib.h&gt; ...

работа с функциями в С++ !! - C++
помогите сделать задачу !нужно найти найбольший общий делитель пятинатуральных чисел !))) очень прошу сделайте кто нибуть !!!! ...

Работа с функциями - C++
Здравствуйте. Есть задание: Напишите программу, которая использует 3 определяемых пользователем функции и генерирует вывод.....Одна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.