2013-05-18 55 views
3

我想实现C++中的策略模式,但我得到了以下错误:类不是抽象的,但我得到错误C2259:不能实例化抽象类

错误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) { 
     [...] 
    } 
}; 

我不明白为什么我得到一个错误的尝试实例在一个抽象类在顶部相交的方法?

回答

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

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

+0

我的天啊。这是一个邪恶的错字,感谢您为我找到它。嘿。 –

+0

@MarcIlsøPoulsen欢迎您 – taocp

2

您对LinearRootSolver::findRoot的定义具有错误的签名特别地,第一参数应该是一个指针根据声明在INumericalRootSolver

void findRoot(Vector3& P, float a, float b, Ray& ray) override { 
    [...] 
} 

这止跌:

void findRoot(Vector3* P, float a, float b, Ray& ray) { 
//     ^Here 
    [...] 
} 

在C++ 11,则可以通过使用override关键字避免这种错误不会编译,因为函数不会覆盖基类中的函数。

1

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

为了获得适当的覆盖,您需要对两种方法都有相同的方法签名。

相关问题