【问题标题】:c++ inheritance design issuec++继承设计问题
【发布时间】:2012-06-11 16:18:42
【问题描述】:

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

【问题讨论】:

  • 你如何初始化那个vector
  • vector&lt;Query*&gt; m; 然后是vector&lt;Query&gt;::const_iterator... 容器的真实类型是什么?无论如何,错误表明您正在从Query 的构造函数/析构函数调用Query 的虚函数...

标签: c++ polymorphism abstract-class pure-virtual


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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 )?

    【讨论】:

    • 如果您尝试创建 Query 值,编译器应该标记,因为您无法创建抽象类型的对象...
    • 这不是他遇到的编译器问题吗?
    • 编译器不允许您创建抽象类的实例,这意味着它会失败您有一个可以调用纯虚函数的实例之前。
    【解决方案3】:

    改变

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

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

    【讨论】:

    • 有*,忘记写在这里了。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2011-04-22
      • 2012-05-11
      • 2011-09-01
      相关资源
      最近更新 更多