Вообще-то, полная реализация виртуальных методов Save и Load присутствует:
//+------------------------------------------------------------------+ //| Writing list to file. | //| INPUT: file_handle -handle previously opened for writing file. | //| OUTPUT: true if OK, else false. | //| REMARK: m_curr_node unchanged. | //+------------------------------------------------------------------+ bool CList::Save(int file_handle) { CObject *node; bool result=true; //--- checking if(!CheckPointer(m_curr_node) || file_handle<0) return(false); //--- writing //--- writing begin marker - 0xFFFFFFFFFFFFFFFF if(FileWriteLong(file_handle,-1)!=sizeof(long)) return(false); //--- writing type if(FileWriteInteger(file_handle,Type(),INT_VALUE)!=INT_VALUE) return(false); //--- writing list size if(FileWriteInteger(file_handle,m_data_total,INT_VALUE)!=INT_VALUE) return(false); //--- sequential scan elements of the list, with a method call Save() node=m_first_node; while(node!=NULL) { result&=node.Save(file_handle); node=node.Next(); } //--- return(result); } //+------------------------------------------------------------------+ //| Reading list from file. | //| INPUT: file_handle -handle previously opened for reading file. | //| OUTPUT: true if OK, else false. | //| REMARK: m_curr_node unchanged. | //+------------------------------------------------------------------+ bool CList::Load(int file_handle) { uint i,num; CObject *node; bool result=true; //--- checking if(file_handle<0) return(false); //--- reading //--- reading and checking begin marker - 0xFFFFFFFFFFFFFFFF if(FileReadLong(file_handle)!=-1) return(false); //--- reading and checking type if(FileReadInteger(file_handle,INT_VALUE)!=Type()) return(false); //--- reading list size num=FileReadInteger(file_handle,INT_VALUE); //--- progressive establishment of list items, with the method call Load() Clear(); for(i=0;i<num;i++) { node=CreateElement(); if(node==NULL) return(false); Add(node); result&=node.Load(file_handle); } //--- return(result); }
Конечно их можно переопределить, но в 99% случаев этот способ сериализации списков отлично подходит.
Но упоминание виртуальности конечно надо добавить в документацию. Спасибо!

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Когда читаешь документацию, не совсем понятно, какие методы реализованы натурально, а какие методы определены декларатоивно, на уровне интерфейса. Т.е. разработчики определяют виртуальную функцию и ее параметры (интерфейс), а пользователи уже сами должны наполнять ее содержимым.
Вот читаешь допустим доку по классу CList:
Метод Save - Сохраняет данные списка в файл. Однако нигде почему-то не написано, что это только декларативный метод и сам по себе он ничего сохранять не будет. Что бы он что то сохранял необходимо его наполнить конкретным содержимым. Указание что это виртуальный метод, быстро сможет сориентировать пользователей. Особенно это касается базовых классов. Таких методов там очень много.