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

时间:2013-05-18 19:08:16

标签: c++ visual-c++ compiler-errors

我正在尝试在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) {
        [...]
    }
};

我无法理解为什么在顶部的intersect方法中尝试实例化一个抽象类时会出现错误?

3 个答案:

答案 0 :(得分:6)

 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();

它试图创建一个抽象类的对象,你得到了编译错误。

答案 1 :(得分:2)

您对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 {
    [...]
}

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

答案 2 :(得分:1)

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

您需要为两种方法使用相同的方法签名才能获得正确的覆盖。