![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Podarochek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 2.11.2007 Репутация: нет Всего: нет |
ссори, может я не так выразился...конечно же реализация будет предполагать С++, но имеется в виду раскрыть карты С++ и показать механизм явно (таблицу указателей). как сказал xvr этот механизм и так есть уже в С++
Добавлено через 13 минут и 5 секунд Я думаю по теме (еще одна ошибка) хоть убей, не могу понять что от меня хотят, кажись все реализованно как говорят по учебнику, а пишет: Error 3 error C2259: 'Boss' : cannot instantiate abstract class Error 4 error C2259: 'CommissionWorker' : cannot instantiate abstract class и все...:( Добавлено через 14 минут и 32 секунды
|
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну в принципе именно так я и понял задание с самого начала..потом сбили дополнительные высказывания )) кстати насчет vtable - на самом деле таблица не представлена в виде набора массива однотипных указетелей а виде набора разных структур, содержаших разнотипные указатели вот доработал еше чтоб больше походило на реальный механизм - хотя и еше есть что доработать:
Это сообщение отредактировал(а) mes - 23.5.2008, 16:29 |
||||
|
|||||
Podarochek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 2.11.2007 Репутация: нет Всего: нет |
спасибо mes буду разбираться
по поводу второго примера подскажешь? |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
у тебя в этих классах есть абстрактные функции, а такие обжекты создавать нельзя
Добавлено через 1 минуту и 22 секунды глянул в код - так у тебя у самого черным по белому написано
![]() |
||||||
|
|||||||
Podarochek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 2.11.2007 Репутация: нет Всего: нет |
ну да базовый класс создан абстрактным, а производный класс например я изменил ->(теперь без virtual)
//класс CommissionWorker, производный от класса Employee class CommissionWorker : public Employee { public: CommissionWorker( const char *, const char *,double = 0.0, double = 0.0,int = 0 ); void setSalary( double); void setCommission( double); void setQuantity( int); double earnings() const; void print() const; private: double salary;//базовая заработная плата за неделю double commission;//комисионные от продажи одного изделия int quantity; //количество проданных изделий за неделю }; всеравно ошибки. Объекты производных классов разве нельзя создавать? Добавлено через 4 минуты и 27 секунд например объект А1 ob; |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
можно создавть объект и в стеке и по new при условие что у класса нет абстрактных методов.. пояснение: если у предка есть абстрактные методы - то они все должны получить реализацию у потомка слово virtual важно только для первого употребления, после этого у потомков метод с таким именем всегда будет считаться виртуальным надо не интерфейс изменять а добавить реализцию к чистым методам Добавлено через 1 минуту и 8 секунд P.S зря ты обе темы в одной ветке запостил .. путает |
|||
|
||||
Podarochek |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 2.11.2007 Репутация: нет Всего: нет |
![]() earnings вместо earning!!! Я балбес. Конечно они должны быть одинаковы...откуда взяласт s до сих пор не могу понять ![]() Добавлено через 2 минуты и 3 секунды о втором посте(т.е. ответвлении от основной темы) забыли...прошу прощения!!! ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вот еше раз доработал код,
на этот наконец то отделил технические операции от представления класса : этот вариант можно считать законченым (потому как для дальнейших улучшений требуются шаблоны, а это будет вне задания ) ![]()
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
мелкие доработки перегрузка некоторых функций (возврашаюших vtable) по типу наследование прокси-функций а также убрал зависимость от порядка инициализации
Это сообщение отредактировал(а) mes - 24.5.2008, 19:04 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Podarochek, не думал, что меня так зацепит эта тема ))
вот еше немного добавил в илюстрацию теперь есть: псевдо pure-абстрактный класс, и два класса: один с частичной другой с полной перегрузкой абстрактных методов
Это сообщение отредактировал(а) mes - 24.5.2008, 20:39 |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Ну вот дошли и до извращений .
Специально для любителей таких вещей : main.cpp :
A_vtable.h :
теперь есть возможность "переключать" код между режимами (за/раскомментировать строку #define VIRTUAL_ILLUSTRATION ) : 1. реальные виртуальные методы 2. псевдо виртуальные методы (реализованые вручную (без помощи) компилятора ) Хотя реальной пользы от программы нет - мне кажется он может помочь понять механизм работы виртуальных методв (у тех у кого проблемы) теперь весь код псевдо производимый компилятором выделен и можно пронаблюдать различия и увидеть сколько черной работы он(компилятор) делает за программиста. Это сообщение отредактировал(а) mes - 24.5.2008, 23:08 |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Круто ![]() Предлагаю в качестве дальнейших шагов рассмотреть множественное наследование, виртуальные базовые классы и RTTI/dynamic_cast ![]() PS. Предлагаю предыдущий пост поместить в FAQ. Это сообщение отредактировал(а) xvr - 25.5.2008, 10:36 |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
учел замечания и убрал лишнее. буду рад комментам
надо будет подумать ( когда будет свободное время ) Это сообщение отредактировал(а) mes - 25.5.2008, 15:56 |
||||||
|
|||||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Коментарий: способ оформления таблицы виртуальных функций (как это делает компилятор)
т.е. какой либо код для построения таблицы виртуальных функций отсуствует вообще, только присваивание адреса в конструкторе |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
то есть разница что компилятор строит ее в компил-тайм, а в моем примере в рантайме ? ну так оно и есть: в одном случае таблица строится управляемая инструкциями типа virtual во время парсинга кода во втором строится за счет рант-тайм кода конструкторов также наверно то что используются прокси функции для вызова ? ну так в реальном (откомпиляторном виде) все функции приведены к такому виду и компилятору не приходится мучаться а нам приходится его обманывать )) ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |