Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с полиморфизмом 
V
    Опции темы
drayvhard
Дата 21.6.2013, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.2.2012

Репутация: нет
Всего: нет



Привет всем!

Вот у меня следующая проблема:

Код

class A
{
protected:
deque<double> some_deq;
public:
A(int i, int j)
{
...
}
double calc(double a)
{
return a;
}
void add_el()
{
some_deq.push_back(calc(5.0));
}
}

class B: public A
{
B b = B(int i,int j, int k):A(i,j)
{
...
}

double calc(a)
{
return a*2;
}
}

...
void main()
{
B b = B(0,0,0);
b.add_el();
}


Вот в some_deq добавляется не 10, а 5! Почему метод не перекрывается?
PM MAIL   Вверх
bsa
Дата 21.6.2013, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



во-первых, у тебя это не скомпилируется. Будет ошибка в строчке 22.
во-вторых, для перекрытия метода он должен быть объявлен виртуальным в базовом классе (кстати, деструктор в этом случае тоже следует делать виртуальным).
PM   Вверх
drayvhard
Дата 21.6.2013, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.2.2012

Репутация: нет
Всего: нет



Цитата(bsa @ 21.6.2013,  21:00)
во-первых, у тебя это не скомпилируется. Будет ошибка в строчке 22.
во-вторых, для перекрытия метода он должен быть объявлен виртуальным в базовом классе (кстати, деструктор в этом случае тоже следует делать виртуальным).

Да, на 22 действительно затупил (сюда я вставил просто абстрактную форму), там все нормально... Код компилится..

cделал в базовом virtual double calc(double a)
{
return a;
}

конструктор В:

B(int i,int j, int k): A(i,j)
{
....
}

Все равно выводит 5, а не 10 
PM MAIL   Вверх
bsa
Дата 21.6.2013, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



drayvhard, код полностью в студию
PM   Вверх
drayvhard
Дата 21.6.2013, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.2.2012

Репутация: нет
Всего: нет



Цитата(bsa @ 21.6.2013,  21:29)
drayvhard, код полностью в студию

Код


class IndicatorSeries
     {
            protected:
        long minLengh;
        int TimeFrame;
        Security Sec;
        slot dataUpdated;
        void OnUpdate(std::pair<Security,int> event_values);

     public:
        deque<DateValue> Series;

        IndicatorSeries(Security sec, short tf, int minLen)
        {
            Sec=sec;
            TimeFrame=tf;
            this->minLengh=minLen;
            fill();
            dataUpdated.init(OriginCandleData::Instance().data_updated,&IndicatorSeries::OnUpdate,this);
        }

        virtual double calc(long cursor){return -4;}

        void fill()
        {
            size_t size = OriginCandleData::Instance().GetSeries(Sec,this->TimeFrame).Date.size();
            for (long i=size-1; i>=0; i--)
            {
                if (abs(long(i+1-size))>=minLengh)
                {
                    Series.push_front(DateValue(OriginCandleData::Instance().GetSeries(Sec,this->TimeFrame).Date[i],calc(i)));
                }
                else
                {
                    Series.push_front(DateValue(OriginCandleData::Instance().GetSeries(Sec,this->TimeFrame).Date[i],0));
                }
            }
        }
     };

class SMA: public IndicatorSeries
{
public:
    SMA(Security sec, int TF, int Period): IndicatorSeries(sec, TF, Period){};
    double calc(long cursor);
};

cpp
double SMA::calc(long cursor)
{
    return 2;
}


PM MAIL   Вверх
drayvhard
Дата 21.6.2013, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.2.2012

Репутация: нет
Всего: нет



и вызов:

SMA sma = SMA(Security("GTS","ALMK"),5,5);
PM MAIL   Вверх
xvr
Дата 22.6.2013, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



В конструкторе и деструкторе виртуальность не работает. А ваш виртуальный calc() вызывается из конструктора


PM MAIL   Вверх
drayvhard
Дата 22.6.2013, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 1.2.2012

Репутация: нет
Всего: нет



xvr, спасибо! можно тему закрывать!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.