2012-05-05 30 views
1

すべての派生クラスのインターフェイスを定義する基本クラスを作成しようとしています。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) 
{ 
    //... 
} 

ノート、コードは少し読みやすくするために参照することによりなどを渡します。

私はこれを修正するために何ができますか?仮想以外の関数で純粋な仮想メンバ関数を使用するのは良い考えですか?

+0

'Deriv.h'は、関数を宣言する行です。 – romeovs

+0

正しく書かれたプログラムで純粋な仮想関数を実際に呼び出すことはありません。むしろ、対応する最も派生したオーバーライドを呼び出します。少なくとも1つはオーバーライドされています。 –

+0

あなたのプログラムは実際に "純粋仮想関数呼び出し"というクラッシュをしていますか? –

答えて

3

「警告:派生:: f(char)の意味はなんですか:: Base :: f(double)」の項目を参照してください。元のEnglish version of the FAQを含むFAQの多数のミラーで入手できます。

投稿する前にFAQをチェックすることをお勧めします。

FAQ項目は「OK」ですが、私のベース内でこのオブジェクトで動的バインディングが動作しているかのようにその動作をシミュレートする方法はあります(直接的な問題ではありませんが)。クラスのコンストラクタであるかどうかを確認してください。さらに、それが関連する場合は、my blog article about the DBDI problemを読むことにも興味があります。

+0

うわー、それは別の午後の無駄だ!奇妙な彼らはクラスでそれを教えていない...ありがとう! – romeovs

+0

これは継承に関する最も難しい問題の1つです。それを避ける一つの方法は、 'private'ベースから継承し、' public'インターフェースで 'using'を使ってメンバーを宣言することです(宣言をひとつだけ宣言することで過負荷メンバーを宣言できます)。 – Walter

2

明らかなタイプミスは明らかである:

virtual void readConfug 

代わりの

virtual void readConfig 

また、何を実装しているのはFYI、テンプレートメソッドパターンと呼ばれています。

+0

oopsは、それを上に置くのtypoだった。はい、私はそれがデザインパターンであることを知っていました! – romeovs

+0

@romeovs私はコードに他の問題はありません。問題を浮き彫りにする最小限の例を再現できますか?これがコンパイルされます。 –

+0

私は多くのことを疑っています..問題はもっと深くなければならないでしょう。私はそれを載せたいが、問題は 'Base'と' Deriv'の間に別の純粋な仮想クラスがあることです。私は何ができるかを見ていきます。 – romeovs