类不是抽象的,但我收到错误 C2259:无法实例化抽象类

Class isn't abstract but I get Error C2259: cannot instantiate abstract class

本文关键字:C2259 错误 抽象类 实例化 抽象的      更新时间:2023-10-16

我试图在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 {
    [...]
}

这将无法编译,因为该函数不会覆盖基类中的函数。

您的派生类使用引用,而您的接口使用指针。

您需要为这两个方法提供相同的方法签名,以便获得适当的覆盖。