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

标签 c++ clone abstract

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

Circle.cpp(34) : error C2259: 'Circle' : cannot instantiate abstract class due to following members: 'void Shape::particle(const Ray &,const int&)' : is abstract

我已尝试阅读此内容,我认为 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;

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

要覆盖基类虚方法,您需要在基类中具有完全相同的方法定义才能覆盖它(不过允许共变类型)。

关于c++ - 无法启动抽象类,因为成员是抽象的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832117/

相关文章:

C++通过调用基类优雅地克隆派生类

java - 我如何引用它所扩展的类所引用的对象的[非抽象]字段?

python - 从集合继承。计数器: 'fromkeys' is abstract

c++ - 如何将 SDL_Texture 与 SDL_Renderer 解耦?

C++指针返回结构实现: Linked List

javascript - 克隆 Div 并更改标签

java - 如何克隆 InputStream?

Java-在子类也需要使用的抽象类中使用常量

尝试在 xcode 中退出程序时出现 C++ 11db 错误。初学者级

c++ - 二维波矢