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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2008, 14:21   #1
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию Полиморфизм. Пример.

Вобщем есть пример: http://subscribe.ru/archive/comp.sof.../30154843.html

там рассказывается про такой способ задания объекта класса:
Truck * truck = (Truck*)(new Car);
Может кто-нибудь объяснить как это надо понимать?
Scratch вне форума Ответить с цитированием
Старый 27.09.2008, 15:13   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Учитывая, что Car - родитель, а Truck - его наследник, бред какой-то получается. Ни разу так не делал и не знаю ситуацию, когда это необходимо. К тому же это может привести к неявным ошибкам.
Например в классе truck добавляется свойство "int Kuzov". new Car это свойство не создаст и вероятно будет access violation при попытке доступа к нему, после подобных преобразований типа.
Данный пример, на мой взгляд - это как смастерить табуретку и сказать слепому человеку, что это стул. Сидеть на ней он будет нормально, но при попытке облокотиться на спинку, упадёт.

Последний раз редактировалось pu4koff; 27.09.2008 в 15:16.
pu4koff вне форума Ответить с цитированием
Старый 27.09.2008, 16:10   #3
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
Truck * truck = (Truck*)(new Car);
Может кто-нибудь объяснить как это надо понимать?
хм...

Track* truck = dynamic_cast<(Truck*)>(new Car)

мне кажется приведение типов лучше проводить так - ибо понятнее.

з.ы. пример, на который ты указал - не очень :/
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 27.09.2008, 16:26   #4
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Учитывая, что Car - родитель, а Truck - его наследник, бред какой-то получается. Ни разу так не делал и не знаю ситуацию, когда это необходимо. К тому же это может привести к неявным ошибкам.
Например в классе truck добавляется свойство "int Kuzov". new Car это свойство не создаст и вероятно будет access violation при попытке доступа к нему, после подобных преобразований типа.
Данный пример, на мой взгляд - это как смастерить табуретку и сказать слепому человеку, что это стул. Сидеть на ней он будет нормально, но при попытке облокотиться на спинку, упадёт.
Тогда в моем понимании полиморфизм это:

Код:
class ClassOne {
protected:
int num;
public:
ClassOne(){num=0;};
void func(){num++; cout << num << "\n";};
};

class ClassTwo : public ClassOne {
public:
void func(){num--; cout << num << "\n";};
};

void main(){
ClassOne *One = new ClassOne;
ClassTwo *Two = new ClassTwo;
One->func(); // Оригинальный метод
Two->func(); // Полиморфный метод
}
Правильно или нет?

Последний раз редактировалось Scratch; 27.09.2008 в 16:39.
Scratch вне форума Ответить с цитированием
Старый 27.09.2008, 16:47   #5
alexinspir
Новичок
Джуниор
 
Аватар для alexinspir
 
Регистрация: 26.08.2008
Сообщений: 1,010
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
Тогда в моем понимании полиморфизм это:

Код:
class ClassOne {
protected:
int num;
public:
ClassOne(){num=0;};
void func(){num++; cout << num << "\n";};
};

class ClassTwo : public ClassOne {
public:
void func(){num--; cout << num << "\n";};
};

void main(){
ClassOne *One = new ClassOne;
ClassTwo *Two = new ClassTwo;
One->func(); // Оригинальный метод
Two->func(); // Полиморфный метод
}
Правильно или нет?
несовсем - здесь ты просто использовал возможности наследования.
ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.
alexinspir вне форума Ответить с цитированием
Старый 27.09.2008, 16:52   #6
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от alexinspir Посмотреть сообщение
несовсем - здесь ты просто использовал возможности наследования.
А как же тогда в этом примере сделать полиморфизм?
Scratch вне форума Ответить с цитированием
Старый 27.09.2008, 17:02   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Scratch Посмотреть сообщение
А как же тогда в этом примере сделать полиморфизм?
func описать как виртуальный метод
pu4koff вне форума Ответить с цитированием
Старый 27.09.2008, 17:05   #8
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
func описать как виртуальный метод
Под мой код можешь привести пример?
Scratch вне форума Ответить с цитированием
Старый 27.09.2008, 17:09   #9
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

как-то так вроде:
Код:
class ClassOne {
protected:
int num;
public:
ClassOne(){num=0;};
virtual void func(){num++; cout << num << "\n";};
};

class ClassTwo : public ClassOne {
public:
void func(){num--; cout << num << "\n";};
};

void main(){
ClassOne *One = new ClassOne;
ClassOne *Two = new ClassTwo;
One->func();
Two->func();
}
pu4koff вне форума Ответить с цитированием
Старый 27.09.2008, 17:32   #10
Scratch
Пользователь
 
Аватар для Scratch
 
Регистрация: 25.09.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
как-то так вроде:
Код:
class ClassOne {
protected:
int num;
public:
ClassOne(){num=0;};
virtual void func(){num++; cout << num << "\n";};
};

class ClassTwo : public ClassOne {
public:
void func(){num--; cout << num << "\n";};
};

void main(){
ClassOne *One = new ClassOne;
ClassOne *Two = new ClassTwo;
One->func();
Two->func();
}
А в чем разница что с virtual что без нее?
Scratch вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
П Р О С Т Е Й Ш И Й пример 3D aesoem Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 16.07.2008 16:54
Пример из учебника valerij Microsoft Office Excel 11 20.06.2008 15:43
Пример патчинга Д'якон Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 17.02.2008 19:27
пример парсинга Stanislav Общие вопросы Delphi 4 14.01.2008 03:48