0

我是多态的新手,这是一个与此类似的问题,解决方案对我没有帮助。确切的错误是:

Circle.cpp(34):错误 C2259:“Circle”:由于以下成员,无法实例化抽象类:“void Shape::particle(const Ray &,const int&)”:是抽象的

我试图阅读这个,我认为是 clone() 成员函数,调用 Circle 的复制构造函数将它的状态复制到新创建的 Circle 对象中并尝试初始化“粒子”(它不能这样做)。如果我是对的:我该如何纠正?如果我错了......它在做什么(我做错了什么)以及如何纠正它。

class Shape {
public:

virtual void particle(const Ray& ray, const int& count) = 0;      
...
virtual Shape* clone()  const = 0;   
private:
vector<Ray>  incoming_ray; 
vector<int>  counts;
};

class Circle : public Shape {
public:
Circle* clone()  const;   //covariant return type
virtual void
particle(const Ray& ray, const int& count);
 ...
};

接着

Circle* Circle::clone()  const { return new Circle(*this); }

void
Circle::particle(const Ray& rays, const int& count){
incoming_ray.push_back(inc_ray);
counts.push_back(counts);};

我试过了

virtual void particle(const Ray& ray, const int& count) const = 0; 
                                                          ^

但仍然有同样的错误?

谢谢

4

1 回答 1

3
virtual void particle(const Ray& ray, const int& count) const = 0;
                                                        ^^^^^^

使它成为一种完全不同的方法。并且不一样:

virtual void particle(const Ray& ray, const int& count) = 0;

最终,您所拥有的是派生类中的一个新方法,它是纯虚拟的,它不会覆盖基类的纯虚拟方法。由于没有overidding,它为您的派生类留下了一个它没有实现的继承的纯虚函数,并且它使您的派生类也成为抽象类。

覆盖基类虚拟方法您需要在基类中具有完全相同的方法定义才能覆盖它(尽管允许协变类型)。

于 2012-05-31T10:51:42.827 回答