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

Cannot initiate an abstract class because members are abstract

本文关键字:成员 抽象的 因为 启动 抽象类      更新时间:2023-10-16

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

Circle

.cpp(34):错误 C2259:"Circle":无法实例化抽象类 由于以下成员: 'void Shape::p article(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; 
                                                          ^

但仍然遇到同样的错误?

谢谢

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

使其成为一种完全不同的方法。并且与以下不同:

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

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

重写基类虚拟方法 您需要在基类中对方法具有完全相同的定义才能重写它(但允许使用协变量类型)。