这可能是一个非常简单的问题,但我不知道如何解决它。我有以下C ++类的设置:
MappingTechnique.h
struct MappingTechnique {
virtual void processFrame();
};
struct SimpleGreedyMappingTechnique : MappingTechnique {
void processFrame();
};
MappingTechnique.cpp
#include "MappingTechnique.h"
void SimpleGreedyMappingTechnique::processFrame() {
}
然而,当我构建(使用CMake
)时,我收到以下错误:
Linking CXX executable PayloadRegionMapper
Undefined symbols for architecture x86_64:
"typeinfo for MappingTechnique", referenced from:
typeinfo for SimpleGreedyMappingTechnique in MappingTechnique.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [PayloadRegionMapper] Error 1
make[2]: *** [CMakeFiles/PayloadRegionMapper.dir/all] Error 2
make[1]: *** [CMakeFiles/PayloadRegionMapper.dir/rule] Error 2
make: *** [PayloadRegionMapper] Error 2
我不知道这里有什么问题?为什么我不能在子类中实现超类的virtual
方法?任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
好的,我自己找到了解决方案,感谢@ Sneftel的评论,注意到我没有将它声明为 pure 虚拟,也没有给它定义。
在谷歌搜索意味着什么后,我提出了以下选项:
给出一个定义:
struct MappingTechnique {
virtual void processFrame() {};
};
让它变得纯洁:
struct MappingTechnique {
virtual void processFrame() = 0;
};
我决定让它变得纯粹,唯一需要注意的是当使用抽象类时(并且它还不知道它将被初始化的实际子类),你需要使用:
MappingTechnique *mappingTechnique
代替MappingTechnique mappingTechnique
(当你考虑它时这是合乎逻辑的,但对于C ++新手来说可能不那么明显)。感谢@Sneftel!