C++ 继承设计问题

c++ inheritance design issue

本文关键字:问题 继承 C++      更新时间:2023-10-16

在 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 函数?谢谢。

仅当您尝试从该类型的构造函数或析构函数调用纯虚函数时,该错误才会发生在语言中(其中大多数派生类型尚未构建/已被销毁):

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

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

你确定 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下工作正常。

我也在我的一些项目中使用了大量次。

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

更改

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

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

我可能错过了一些东西,但这对我有用:我已经知道我没有初始化等;-)

#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;
}