3

在 c++ 中,我想要一个抽象类型 Query 的数组,它具有函数 calcScore() ,它是一个纯虚函数。
我有两个非抽象类:ConQuery 和 DisQuery,它们实现了 calcScore 函数。

为了做到这一点,我定义了这样的数组:

vector<Query*> m;

我迭代并像这样调用函数:

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

调用Query的纯虚函数时出现错误。如何通过多态类型调用 ConQuery 或 DisQuery 的函数?谢谢。

4

4 回答 4

3

如果您尝试从该类型的构造函数或析构函数调用纯虚函数(其中最派生的类型尚未构建/已被销毁),则该错误只会在该语言中发生:

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

请注意,编译器通常会将上面的代码标记为错误,但如果调用不是直接在构造函数/析构函数中,则编译器将无法检测到它,例如,如果您将对对象的引用传递给执行调用的不同函数。

于 2012-06-11T16:29:37.557 回答
2

您确定在 ConQuery 和 DisQuery 中实现了 CalcScore 吗?我试过这个:

#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 下运行良好。

我也在我的一些项目中多次使用它。

也许您尝试 push_back 查询项目(而不是 con/dis)?

于 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 回答