c++ - 因为以下虚函数在一个类中是纯的
问题描述
我有以下要编译的代码。起初一切都很好。我做了一些修改,然后出现以下错误。我真的真的不明白发生了什么:
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
修饰符添加到基类中的声明中,或者将其从子类中的覆盖中删除。
推荐阅读
- javascript - Bazel:我如何使用 nodeJS_binary 规则来执行“npm run start”
- freemarker - 如何在 FreeMarker 中打印任何变量?
- bash - Shell 脚本 - 使用 shell 脚本遍历子目录
- c# - 如何从 C# websocket 客户端将数据流式传输到磁盘?
- python - 绘制 SVM 预测值时的真值误差
- c# - linq:对 xml 中的重复节点进行分组、排序和删除
- c# - 如何均衡两个列表中的记录数以在c#中计算
- batch-file - 如何强制杀死所有具有相同名称的进程,但批处理程序除外?
- spring - 如何在春季应用程序启动时从资源目录加载所有.yml文件?
- c - C:返回行中的 OR 运算符?