2012-03-02 13 views
0

EDIT:私は純粋な仮想関数を間違って実装しましたか?

I have no updated the question, whilst doing so I realized the scope of the question has completely changed, so I apologize for this. I am dealing with Threads so that static function has to be there. I have tried to abstract the Threading stuff out of the question as much as possible.

私はpure virtual function callエラーを取得していますので、私は多分、私が実装間違っを持っていると思いました。ここで私が持っているものです。

class Base 
{ 
    protected: 
     virtual int f(void) = 0; 
     static void baseFunction(void* param); 
}; 

static void Base::baseFunction (void* param) 
{ 
    Base *parent = (Base*) parameter; 

    int i = parent->f(); 
} 

class Derived : public Base 
{ 
    private: 
     int _memeber; 
     int f(void); 
}; 

int Derived::f(void) 
{ 
    _member = 0; 

    cout << "Derived _memeber is: " << _member << endl; 

    return 0; 
} 

void main() 
{ 
    Derived d; 

    d.baseFunction(d); 
} 

私はDerivedクラスのメンバへのアクセス権を持っている機能Derived::f(void)を必要としています。あなたは

class Derived : public Base 
{ 
    protected: 
     virtual int f(void); 
} 

を宣言する必要が

+1

これは実際のコードですか?いずれかのクラスの定義後にセミコロンはありません。 – hmjd

+1

また、定義は 'int Derived :: f(void)'と言うべきです。しかし、あなたはいつエラーを取得していますか?それはコンパイラかランタイムエラーですか? 'Derived 'と呼んでいますか? –

+0

コードはそのままです(hmjdの発言をモジュロにする)、良いです。どこか別の問題があるはずです。 –

答えて

2

int main() 
{ 
    Derived d; 
    d.f(); 
} 

を追加定義は正常に見えるが、私はあなたがBaseのコンストラクタまたはデストラクタから仮想関数を呼び出しているの推測をハザードます。その場合、仮想ディスパッチはではなく、Derivedであるかのように実行され、関数が純粋仮想であれば未定義の動作をします。

更新:あなたはまた、「私はスレッドを扱っている」と言っています。その場合、別のスレッドがまだオブジェクトを構築している間に、データ競合によってあるスレッドが関数を呼び出す可能性があります。すべてのデータアクセスが正しく同期されていることを確認する必要があります。

+0

+1:VC10がこれを検出して「未解決」とレポートし、VC9が「純仮想関数呼び出し」エラーをスローしました –

+0

興味深いことに、Derivedクラスのコンストラクタからパラメータを削除しました。私は問題がある。これを行うと、 'Derived d;'は動作しますが、 'Derived d = Derived(param)'は実行されません。 – Cheetah

-2

私はあなたの純粋仮想関数の呼び出しは、それの方法の別にFを使用して基本クラスから来ていると仮定します。

+1

または、基本クラスのコンストラクタから 'f'を呼び出します。 –

+4

いいえ、基本クラスの 'virtual'メソッドを宣言すると、すべての派生クラスで仮想化されます。子供に 'virtual'を指定する必要はありません。 –

0

クラス宣言の後にセミコロンがありません。

0

Derivedメソッドに戻り値の型を追加します。また、クラス定義の後にセミコロンを追加してください。

0

fとの戻り値の型がありません。クラス定義の後

は、可能であれば

class Base 
{ 
    protected: 
     virtual int f(void) = 0; 
}; 

class Derived : public Base 
{ 
    public: 
     int f(void); 
}; 

int Derived::f(void) 
{ 
    // do something here 
} 

さらに、ポスト実行可能なコードにコードを変更し

。 IOWは、あなたのコードサンプルに

0

2つのクラスのすべての機能を公開します。なぜ私はint iを宣言していますか?それはまったく使用されていません。

関連する問題