Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2011, 22:24   #1
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
Восклицание c++ virtual function

Здравствуйте уважаемые форумчанины.....
Возник такой вопрос...
Есть у меня класс с некоторыми методами. Эти методы мне надо сделать виртуальными. В одной из книг сказано, что нужно сделать через наследование и написать класс, который будет управлять базовым...
Скажите пожалуйста обязательно ли делать дочерний класс для управления базового и как тогда в этом случаи переопределять виртуальные методы???
Заранее спасибо.
world12_tk вне форума Ответить с цитированием
Старый 12.11.2011, 23:59   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Не обязательно, конечно. Нужно делать так, как эффективнее с точки зрения планируемой архитектуры.
Если виртуальный метод реализуется только в дочернем классе - базовый класс называют абстрактным. Но никто так делать не заставляет, очевидно.
Son Of Pain вне форума Ответить с цитированием
Старый 13.11.2011, 00:22   #3
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

аааа.... у меня уж мозг плавиться. я не понимаю...(((
Son Of Pain
у меня есть класс в котором реализованы методы... Как мне превратить их в виртуальные.... Если я переопределяю эти методы в дочерним классе, то что я должен там писать????

Последний раз редактировалось world12_tk; 13.11.2011 в 00:29.
world12_tk вне форума Ответить с цитированием
Старый 13.11.2011, 00:32   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

В родительском классе писать перед возвращаемым типом слово virtual.
В дочерних классах можно тоже писать virtual, а можно ничего не писать - компилятор поймет сам.
Son Of Pain вне форума Ответить с цитированием
Старый 13.11.2011, 00:47   #5
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

тогда такой вопрос....
вот мой класс:
Код:
class Dates
 {
   public:
      Dates(unsigned int day, Month month, unsigned int year, String smb);
      void Prev();
      String Print();
      void Setformat (String format);
   private:
      unsigned int dd;
      Month mm;
      unsigned int yy;
      String format;
 };
Все методы у меня описаны.....
Если я делаю виртуальным метод Print, то его должен переопределить в дочернем классе?
Как тогда будет выглядеть дочерний класс?
world12_tk вне форума Ответить с цитированием
Старый 13.11.2011, 00:54   #6
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Не "должен", а "можешь". Можешь переопределить, можешь не переопределить, можешь переопределить в дочернем классе дочернего - как душе угодно.


А выглядеть будет обычно -
Код:
class child: public Dates
{
 public:
    String Print();
};
Son Of Pain вне форума Ответить с цитированием
Старый 13.11.2011, 01:05   #7
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

ага..... эт значит, когда я буду вызывать в объекте child метод Print, то он вызывется из базового????
а для чего это вообще нужно?
world12_tk вне форума Ответить с цитированием
Старый 13.11.2011, 02:04   #8
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Гм. Это называется 'полиморфизм', и является одним из базовых понятий ооп. Я могу объяснить на пальцах, конечно, но лучше возьми любую хорошую книжку, там все это будет расписано намного лучше.

Например у тебя есть класс 'геометрическая фигура'. В нем есть виртуальный метод draw. От него наследуются классы 'круг', 'квадрат', 'треугольник' и т.д. Очевидно, что все они будут переопределять метод draw - ведь фигуры рисуются по-разному.
И полиморфизм позволяет тебе хранить указатели на любые фигуры в одном массиве, и вызывать правильный метод не зная, какая фигура на самом деле там.
Son Of Pain вне форума Ответить с цитированием
Старый 13.11.2011, 12:02   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Цитата:
то он вызывется из базового????
если доступ будет идти НЕ через указатель, то вызовется метод класса того, какого типа переменная

если через укзатель на базовый, то метод того класса, который реально там
p51x вне форума Ответить с цитированием
Старый 13.11.2011, 15:13   #10
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

Спасибочки... начал хоть что то понимать...
Вот такой вопросик еще:
Написал я заголовок дочернего класса в новом файле, компилятор выдает ошибку Expression syntax в строчке конструктора. Не могли бы вы мне объяснить почему?
Код:
class Child:public Dates
 {
  public:
     Child(unsigned int day, Month month, unsigned int year, String smb):Dates(unsigned int day, Month month, unsigned int year, String smb);
      void Prev(){};
      String Print(){};
      void Setformat (String format){};
 };
world12_tk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Mac OS на Virtual PC unbanned Свободное общение 3 27.06.2011 19:08
Abstract, Virtual, ... ImmortalAlexSan Общие вопросы Delphi 3 15.08.2010 14:53
Не работает virtual Syltan Общие вопросы C/C++ 4 14.06.2010 16:44
Virtual machines Elm0 Свободное общение 0 03.02.2008 21:06
Virtual Bus RoadTrain Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 17.09.2007 01:48