因为以下虚函数在 class 中是纯的
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;
根据我的理解,如果函数是虚拟纯函数,我必须在派生函数中实现它 class。为什么我会遇到这个问题?
/******************************************************************************
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;
}
why i am getting that problem?
因为你的 base class 中的签名与你的 subclass 中的签名不同:
virtual std::string *getAnswer() = 0;
对
std::string *getAnswer() const { return {}; }
您需要将 const
修饰符添加到基础 class 的声明中,或者将其从子 class 的覆盖中删除。
当您覆盖函数时,签名必须完全相同的类型。即使是轻微的扰动也会导致它不算作覆盖。对于您的情况,我们有
virtual std::string *getAnswer() = 0;
std::string *getAnswer() const { ... }
您需要删除 const
。
如果您使用的是 C++11 或更新版本,请考虑将 override
注释添加到方法的末尾以作为覆盖。然后如果发生这样的事情,你会得到更具体的错误,你可以更早地发现它。
std::string *getAnswer() const override { ... }
我正在尝试编译以下代码。起初一切都很好。我做了一些修改,然后出现以下错误。我真的真的不明白发生了什么:
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;
根据我的理解,如果函数是虚拟纯函数,我必须在派生函数中实现它 class。为什么我会遇到这个问题?
/******************************************************************************
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;
}
why i am getting that problem?
因为你的 base class 中的签名与你的 subclass 中的签名不同:
virtual std::string *getAnswer() = 0;
对
std::string *getAnswer() const { return {}; }
您需要将 const
修饰符添加到基础 class 的声明中,或者将其从子 class 的覆盖中删除。
当您覆盖函数时,签名必须完全相同的类型。即使是轻微的扰动也会导致它不算作覆盖。对于您的情况,我们有
virtual std::string *getAnswer() = 0;
std::string *getAnswer() const { ... }
您需要删除 const
。
如果您使用的是 C++11 或更新版本,请考虑将 override
注释添加到方法的末尾以作为覆盖。然后如果发生这样的事情,你会得到更具体的错误,你可以更早地发现它。
std::string *getAnswer() const override { ... }