我明白了:
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;
我收到此错误:'Core'无法实例化抽象类。
出什么问题了?我以为我的虚拟函数已经在CoreScreen中正确声明了。
答案 0 :(得分:0)
我想您知道,“核心”是abstract class,因为它具有pure virtual function: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):
TestCore.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_ */
TestCore.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类定义中。
'希望有所帮助