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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2011, 16:04   #1
Zorgan
Пользователь
 
Аватар для Zorgan
 
Регистрация: 26.08.2011
Сообщений: 16
Вопрос

Полиморфизм

Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса, например:
Код:
class Figure
{
    ...
    void Draw() const;
    ...
};
 
class Square : public Figure
{
    ...
    void Draw() const;
    ...
};
 
class Circle : public Figure
{
    ...
    void Draw() const;
    ...
};
Какая именно из функций будет вызвана — Figure::Draw(), Square::Draw() или Circle::Draw() — определяется во время компиляции. Например:
Код:
Circle *c = new Circle(0,0,5);
Figure *f = c; // Всё ok: Figure — базовый класс для Circle
c->Draw();
f->Draw(); // Указатели друг другу равны, но для f будет вызвана другая функция, чем для c
ктонибуть поясните как работает и что с указателями делать помогите ?

Последний раз редактировалось Stilet; 28.08.2011 в 10:57.
Zorgan вне форума Ответить с цитированием
Старый 26.08.2011, 16:22   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Полиморфизмом в программировании называется переопределение наследником функций-членов базового класса, например:
полиморфизмом называется полиморфное поведение. бывает статический и динамический полиморфизм. В с++ динамический полиморфизм - переопределение виртуальных функций в дочерних классах
Цитата:
Какая именно из функций будет вызвана — Figure::Draw(), Square::Draw() или Circle::Draw() — определяется во время компиляции. Например:
определяется во время выполнения, раз уж мы говорим про динамический полиморфизм
Цитата:
Указатели друг другу равны, но для f будет вызвана другая функция, чем для c
твоя функция-член в базовом классе не виртуальна
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 26.08.2011 в 16:29.
pproger вне форума Ответить с цитированием
Старый 26.08.2011, 18:01   #3
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
ктонибуть поясните как работает и что с указателями делать помогите ?
Тип указателя должен быть "указатель на базовый класс", но на самом деле он должен указывать на производный. То есть:
Код:
class Printer
{
  virtual void Print() = 0;
};
class HelloWorldPrinter : Printer
{
  virtual void Print()
  {
    cout << "Hello, World!";
  }
};

int main()
{
  Printer* printer1 = 0; //инициализация указателя нулем
  printer1 = new HelloWorldPrinter; //создание объекта
  printer1.Print(); //вызов полиморфной функции
  delete printer1; //удаление объекта
}
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 26.08.2011, 18:06   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Сtrl
Ваш код не совсем верен...Проблема в том, что у вас функция-член Print в обоих классах приватная, и вы не сможете её вызвать из main(). Да и приватное наследование...зачем?
_-Re@l-_ вне форума Ответить с цитированием
Старый 26.08.2011, 18:40   #5
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Сtrl
Ваш код не совсем верен...Проблема в том, что у вас функция-член Print в обоих классах приватная, и вы не сможете её вызвать из main(). Да и приватное наследование...зачем?
Согласен. Просто нужно вместо 'class' использовать 'struct'. Писал код наспех.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 26.08.2011, 18:54   #6
Zorgan
Пользователь
 
Аватар для Zorgan
 
Регистрация: 26.08.2011
Сообщений: 16
По умолчанию

Так что ли : struct Printer
struct HelloWorldPrinter : Printer ???
Zorgan вне форума Ответить с цитированием
Старый 26.08.2011, 19:58   #7
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Согласен. Просто нужно вместо 'class' использовать 'struct'.
Что за извращения? Зачем? Вариант указать спецификатор доступа public совсем не рассматривается?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 26.08.2011, 21:22   #8
Zorgan
Пользователь
 
Аватар для Zorgan
 
Регистрация: 26.08.2011
Сообщений: 16
По умолчанию

public ни кто и не указывал ты ошибся !
Zorgan вне форума Ответить с цитированием
Старый 26.08.2011, 23:08   #9
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Что за извращения? Зачем? Вариант указать спецификатор доступа public совсем не рассматривается?
Рассматривался. 3 дополнительных записи 'public' в данном случае будут излишни, так как закрытые члены отсутствуют.

Добавлено:
А, еще кое-что: поскольку printer1 является указателем, обращаться к его члену нужно через оператор '->'.
Код:
printer1->Print();
Ищете информацию по C++?
cplusplus.com

Последний раз редактировалось Сtrl; 26.08.2011 в 23:17.
Сtrl вне форума Ответить с цитированием
Старый 26.08.2011, 23:46   #10
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Zorgan Посмотреть сообщение
public ни кто и не указывал ты ошибся !
Ты не понял о чем я.

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Рассматривался. 3 дополнительных записи 'public' в данном случае будут излишни, так как закрытые члены отсутствуют.
Во-первых не три, а две.
Во-вторых, они не будут излишни, так как это единственный корректный способ сделать методы класса открытыми. Использование struct в данном случаи неправильно
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Полиморфизм MasterSporta Общие вопросы C/C++ 3 10.04.2011 23:46
полиморфизм и констркуторы blacktener Общие вопросы C/C++ 4 06.03.2011 15:47
полиморфизм slayerblya Общие вопросы C/C++ 1 27.02.2011 01:43
Полиморфизм mister2010 Общие вопросы C/C++ 30 24.05.2010 01:07