すべての派生クラスのインターフェイスを定義する基本クラスを作成しようとしています。C++:非仮想関数で純粋仮想関数を使用する
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
から)、非仮想関数が利用可能であるとして認識されていないようです。私は私の派生クラス定義がOKであることを確認:私はconst
-correctnesの多くを省略し
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)
{
//...
}
ノート、コードは少し読みやすくするために参照することによりなどを渡します。
私はこれを修正するために何ができますか?仮想以外の関数で純粋な仮想メンバ関数を使用するのは良い考えですか?
'Deriv.h'は、関数を宣言する行です。 – romeovs
正しく書かれたプログラムで純粋な仮想関数を実際に呼び出すことはありません。むしろ、対応する最も派生したオーバーライドを呼び出します。少なくとも1つはオーバーライドされています。 –
あなたのプログラムは実際に "純粋仮想関数呼び出し"というクラッシュをしていますか? –