无法启动抽象类,因为成员是抽象的

时间:2012-05-31 10:49:14

标签: c++ clone abstract

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

  

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

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

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; 
                                                          ^

但仍然遇到同样的错误?

由于

1 个答案:

答案 0 :(得分:3)

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

使它成为一种完全不同的方法。与以下内容不同:

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

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

覆盖基类虚方法您需要在Base类中使用完全相同的方法定义来覆盖它(尽管允许 Co-variant类型)。