c++ - 无法实例化抽象类?
问题描述
我懂了:
class Core
{
protected:
static unsigned int id_seed;
unsigned int id;
std::string status;
public:
friend class CPU;
Core();
~Core();
virtual void procesare(std::string aplicatie) = 0;
};
class CoreScreen: public Core
{
public:
CoreScreen();
~CoreScreen();
void procesare(std::string aplicatie);
};
和 corescreen.cpp:
#include "CoreScreen.h"
CoreScreen::CoreScreen()
{
}
CoreScreen::~CoreScreen()
{
}
void CoreScreen::procesare(std::string aplicatie)
{
std::string buffer;
std::ifstream file_in(aplicatie);
if (file_in.is_open()) {
std::cout << "Aplicatia " << aplicatie << " ruleaza: " << std::endl;
while (getline(file_in, buffer)) {
std::cout << buffer;
}
file_in.close();
}
else {
throw new CExceptie(APP_FAIL, " Aplicatia nu a putut rula!");
}
}
当我在 main 中使用时:
CoreScreen CS1, CS2, CS3, CS4;
我收到此错误:“核心”无法实例化抽象类。
有什么问题?我以为我在 CoreScreen 中正确声明了我的虚函数。
解决方案
我想你知道,“Core”是一个抽象类,因为它有一个纯虚函数:virtual void procesare(std::string aplicatie) = 0;
.
我想你也知道你不能实例化一个抽象类:因此你的错误。
问题是:
为什么编译器认为您正在尝试实例化“Core”的实例?
你是?
看起来您正在尝试实例化四个 CoreScreen 对象:CoreScreen CS1, CS2, CS3, CS4;
. 如果是这样,那应该完全没问题。
你是对的:procesare()
是虚拟的(“纯虚拟”,碰巧)。您确实在 CoreScreen.cpp 中正确地覆盖了它:它看起来不是问题所在。
问:你有没有在任何地方实施Core::Core()
过Core::~Core()
?如果没有,你是怎么编译的?
问:你确定你没有尝试在任何地方(甚至是“意外”)创建“Core”的实例吗?
不管它值多少钱,以下MCVE编译并运行良好(Ubuntu 18,GCC 7.3.0):
测试核心.h:
/*
* TestCore.h
*/
#ifndef TESTCORE_H_
#define TESTCORE_H_
#include <string>
class Core
{
protected:
static unsigned int id_seed;
unsigned int id;
std::string status;
public:
friend class CPU;
Core();
~Core();
virtual void procesare(std::string aplicatie) = 0;
};
class CoreScreen: public Core
{
public:
CoreScreen();
~CoreScreen();
void procesare(std::string aplicatie);
};
#endif /* TESTCORE_H_ */
测试核心.cpp:
/*
* TestCore.cpp
*/
#include <iostream>
#include <fstream>
#include "TestCore.h"
Core::Core()
{
std::cout << "Core::Core()..." << std::endl;
}
Core::~Core()
{
std::cout << "Core::~Core()..." << std::endl;
}
CoreScreen::CoreScreen()
{
std::cout << "CoreScreen::CoreScreen()..." << std::endl;
}
CoreScreen::~CoreScreen()
{
std::cout << "CoreScreen::~CoreScreen()..." << std::endl;
}
void CoreScreen::procesare(std::string aplicatie)
{
std::cout << "CoreScreen::procesare(" << aplicatie << ")" << std::endl;;
}
int main () {
std::cout << ">>main()..." << std::endl;
CoreScreen CS1, CS2, CS3, CS4;
CS1.procesare("Testing CS1");
std::cout << "<<main()." << std::endl;
return 0;
}
样品输出:
>>main()...
Core::Core()...
CoreScreen::CoreScreen()...
Core::Core()...
CoreScreen::CoreScreen()...
Core::Core()...
CoreScreen::CoreScreen()...
Core::Core()...
CoreScreen::CoreScreen()...
CoreScreen::procesare(Testing CS1)
<<main().
你会注意到我实现了 Core::Core() 和 Core::~Core()。如果您不需要它们 - 甚至不要将它们放在您的 .h 类定义中。
'希望有帮助
推荐阅读
- javascript - 如何获取复选框的最新选中值?
- javascript - 为什么在左上角和左下角的可拖动同时应用时可调整大小给我一个不需要的行为
- angular - 如何在角度指令测试中模拟 removeChild 或 appendChild 函数调用?
- javascript - Angular Unit Test:如何在方法中模拟属性?
- selenium - selenium.common.exceptions.InvalidSelectorException 在 python 3.7 中使用 Selenium
- arrays - 如何显示从多个 API 页面获取的嵌套数组数据
- javascript - 如何为选定的控件创建尾随函数?
- python - 如何通过 python 与 NodeMCU 模块通信?
- c# - 如何在gridview中仅显示当前日期数据?
- django - 我可以将 MariaDB ColumnStore 与 Django (Django-ORM) 一起使用吗?