繁体   English   中英

因为以下虚函数在一个类中是纯函数

[英]because the following virtual functions are pure within a class

我有以下代码正在尝试编译。 起初一切都还好。 我做了一些修改,然后出现以下错误。 我真的真的不明白发生了什么:

main.cpp: In function 'int main()':
main.cpp:38:32: error: cannot declare variable 'mp' to be of abstract type 'MasterPricerContentManager'
     MasterPricerContentManager mp(&query);
                                ^
main.cpp:20:7: note:   because the following virtual functions are pure within 'MasterPricerContentManager':
 class MasterPricerContentManager: public ContentManager {
       ^
main.cpp:17:24: note:   virtual std::string* ContentManager::getAnswer()
   virtual std::string *getAnswer()   = 0;

据我了解,如果一个函数是虚拟的,我必须在派生类中实现它。 为什么我遇到这个问题?


/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>

using namespace std;

class ContentManager {
 public:
  virtual bool execute()= 0;
  virtual void setQuery(std::string *query) = 0;
  virtual std::string *getAnswer()   = 0;
};

class MasterPricerContentManager: public ContentManager {
 public:
   explicit MasterPricerContentManager(std::string *query):_query(query) {}
    ~MasterPricerContentManager() {}
    MasterPricerContentManager(const MasterPricerContentManager &)= delete;

    bool execute() {return true;}
    void setQuery(std::string  *query) {_query = query; }
    std::string       *getAnswer() const { return {}; }

  private:
    std::string * _query;

};

int main()
{  
    std::string query = "hello";
    MasterPricerContentManager mp(&query);

    return 0;
}

为什么我遇到这个问题?

因为基类中的签名与子类中的签名不同:

 virtual std::string *getAnswer()   = 0;

 std::string       *getAnswer() const { return {}; }

您需要将const修饰符添加到基类的声明中,或者从子类的重写中将其删除。

覆盖函数时,签名必须具有完全相同的类型。 即使是轻微的干扰,也不会将其视为替代。 在你的情况下

virtual std::string *getAnswer()   = 0;
std::string *getAnswer() const { ... }

您需要删除const

如果您使用的是C ++ 11或更高版本,请考虑在要用作替代方法的方法末尾添加override注释。 然后,如果发生类似这种情况,您将得到更具体的错误,并且可以更早地发现它。

std::string *getAnswer() const override { ... }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM