すべての派生クラスのインターフェイスを定義する基本クラスを作成しようとしています。
そのクラスの構成ファイルを読み取ることができる機能が必要です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
コードをもう少し読みやすくするために、多くの-correctnes、参照渡しなどを省略したことに注意してください。
これを修正するにはどうすればよいですか? 非仮想関数で純粋な仮想メンバー関数を使用することは良い考えですか?