3

C++ では、純粋仮想関数である関数 calcScore() を持つ抽象型 Query の配列が必要です。
また、抽象的ではない 2 つのクラスがあります。 calcScore 関数を実装する ConQuery と DisQuery です。

そのために、次のように配列を定義しました。

vector<Query*> m;

そして、次のように関数を反復して呼び出します。

for (vector<Query*>::const_iterator it1 = index.begin() ;it1 != index.end() ; it1++)
{
     cout << (*it1)->CalcScore() << endl; 
}

クエリの純粋仮想関数を呼び出すとエラーが発生します。ConQueryの関数やDisQueryの関数をポリモーフィック型で呼び出すにはどうすればいいですか?ありがとう。

4

4 に答える 4

3

エラーは、型のコンストラクターまたはデストラクターから純粋仮想関数を呼び出そうとした場合にのみ、言語で発生する可能性があります (最も派生した型がまだ構築されていない/既に破棄されている場合)。

struct Query {
   virtual void f() = 0;
   Query() {
      f();                // !!
   }
   ~Query() {
      f();                // !!
   }
};

コンパイラは通常、上記のコードにエラーとしてフラグを立てますが、呼び出しがコンストラクター/デストラクターに直接含まれていない場合、たとえばオブジェクトへの参照を呼び出しを実行する別の関数に渡す場合は、検出に失敗することに注意してください。

于 2012-06-11T16:29:37.557 に答える
2

CalcScore が ConQuery および DisQuery に実装されていることは確かですか? 私はこれを試しました:

#include <iostream>
#include <vector>

class Query{
public:
    virtual int CalcScore() = 0;
};

class Query2 : public Query
{
public:
    virtual int CalcScore()
    {

        return 2;
    }
};

class Query3 : public Query
{
public:
    virtual int CalcScore()
    {

        return 3;
    }
};

int main(int argc, char* argv[])
{

    std::vector<Query*> m;
    m.push_back(new Query2());
        m.push_back(new Query3());
    for (std::vector<Query*>::const_iterator it1 =  m.begin() ;it1 !=  m.end() ; it1++)
    {
        std::cout  << (*it1)->CalcScore();
    }
}

私のVS2012では問題なく動作します。

また、いくつかのプロジェクトで何度も使用しました。

Query 項目 ( con/dis ではなく) を push_back しようとしているかもしれません。

于 2012-06-11T16:31:29.540 に答える
1

変化する

for (vector<Query>::const_iterator it1 = index.begin() ;it1 != index.end() ; it1++)

for (vector<Query *>::const_iterator it1 = index.begin() ;it1 != index.end() ; it1++)
于 2012-06-11T16:21:31.770 に答える
1

私は何かを逃したかもしれませんが、これは私にとってはうまくいきます:私はすでに初期化されていないことなどを知っています;-)

#include "stdafx.h"
#include <vector>


class Query
{
public:
    int i;
    void virtual CalcScore() = 0;
};

class ConQuery :public Query
{
public:
    int i;
    void virtual CalcScore() {i++;}

};


int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Query*> index;
    ConQuery b;

    index.push_back(&b);

    for (std::vector<Query*>::const_iterator it1 = index.begin() ;it1 != index.end() ; it1++) 
    {      
        (*it1)->CalcScore();
    } 

    return 0;
}
于 2012-06-11T16:30:26.850 に答える