Я пытаюсь создать базовый класс, определяющий интерфейсы для всех производных классов.
Я хотел бы иметь функцию, которая позволяет читать файл конфигурации для этого класса, который довольно гладко работает с использованием boost::property_tree
. Назовем эту функцию readConfig
. Это должно быть определено в каждом производном классе, поэтому я сделал его чисто виртуальным.
Я хотел бы перегрузить функцию readConfig
в базовом классе, где каждая перегруженная функция в базовом классе в конечном итоге вызывает чистую виртуальную форму, например:
class Base
{
// ...
void readConfig(string, string); // read config from file
virtual void readConfig(boost::property_tree::ptree, string) =0; // read config from ptree
}
void Base::readConfig(string filename, string entry)
{
boost::property_tree::ptree pt;
read_xml(filename, pt);
readConfig(pt, entry); // <= Calling pure virtual function!
}
По сути, строковая версия — это просто быстрая оболочка для чистой виртуальной формы. Когда я компилирую это, я получаю сообщение об ошибке:
no known conversion for argument 1 from std::string to boost::property_tree::ptree`
Получается, что не виртуальная функция (из Base
) не распознается как доступная. Я проверил, что мое определение производного класса в порядке:
class Deriv : public Base
{
// ...
void readConfig(boost::property_tree::ptree, string); // implement virtual, error is on this line
}
void Deriv::readConfig( boost::property_tree::ptree pt, string entry)
{
//...
}
обратите внимание, что я пропустил много const
-корректировок, передачи по ссылке и т. д., чтобы сделать код немного более читабельным.
Что я могу сделать, чтобы исправить это? Является ли использование чистой виртуальной функции-члена в невиртуальной функции хорошей идеей?
Deriv.h
, строка, в которой я объявляю функцию. - person romeovs   schedule 05.05.2012Base:readConfig(string, string)
изDerived
, если только вы явно не вызовете его какBase::readConfig()
или не добавитеusing Base::readConfig;
кDerived
. - person Walter   schedule 05.05.2012