类不是抽象的,但我收到错误 C2259:无法实例化抽象类
Class isn't abstract but I get Error C2259: cannot instantiate abstract class
我试图在c++中实现策略模式,但我得到以下错误:
错误1错误C2259: 'LinearRootSolver':不能实例化抽象类
这是我的代码(错误所在的行用注释标记)。使用策略模式(上下文)的类:
bool Isosurface::intersect(HitInfo& result, const Ray& ray, float tMin, float tMax) {
INumericalRootSolver *rootSolver = new LinearRootSolver(); // error here
[...]
}
这是我的策略模式类:
class INumericalRootSolver {
public:
virtual void findRoot(Vector3* P, float a, float b, Ray& ray) = 0;
};
class LinearRootSolver : public INumericalRootSolver {
public:
void findRoot(Vector3& P, float a, float b, Ray& ray) {
[...]
}
};
我看不出为什么我得到一个错误,试图实例化一个抽象类在相交方法在顶部?
void findRoot(Vector3* P, float a, float b, Ray& ray) = 0;
//^^
和
void findRoot(Vector3& P, float a, float b, Ray& ray)
//^^
参数类型不匹配,因此findRoot
继承的基于表单的类仍然是一个纯虚函数(不重写),这使得LinearRootSolver
类成为一个抽象类。当你这样做的时候:
INumericalRootSolver *rootSolver = new LinearRootSolver();
它试图创建一个抽象类的对象,你得到编译器错误。
您对LinearRootSolver::findRoot
的定义签名错误。特别是,根据INumericalRootSolver
中的声明,第一个参数应该是一个指针:
void findRoot(Vector3* P, float a, float b, Ray& ray) {
// ^ Here
[...]
}
在c++ 11中,可以通过使用override
关键字来避免这个错误:
void findRoot(Vector3& P, float a, float b, Ray& ray) override {
[...]
}
这将无法编译,因为该函数不会覆盖基类中的函数。
您的派生类使用引用,而您的接口使用指针。
您需要为这两个方法提供相同的方法签名,以便获得适当的覆盖。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 如何知道C2259 VS 2017错误未实现哪种方法?
- 如何修复错误C2259:无法实例化抽象类
- 错误 C2259:'CDocument':无法实例化抽象类
- 帮助错误 C2259:无法实例化抽象类
- VS COM项目以32位编译,但在尝试编译64位时引发错误C2259
- 错误 C2259"类":无法实例化抽象类
- 类不是抽象的,但我收到错误 C2259:无法实例化抽象类
- 错误 C2259:"类":无法实例化抽象类
- 错误 C2259:无法实例化抽象类;或"how exactly should i be using virtual functions here?"
- 错误 C2259:'<someclass>':无法实例化抽象类
- 实现IUnknown接口时出现错误c2259:无法实例化抽象类
- 错误c2259从IUnknown实现接口类
- 错误 1 错误 C2259:'Player':无法实例化抽象类