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

Posted

技术标签:

【中文标题】无法启动抽象类,因为成员是抽象的【英文标题】:Cannot initiate an abstract class because members are abstract 【发布时间】:2012-05-31 10:49:14 【问题描述】:

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

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

我已尝试阅读此内容,我认为 clone() 成员函数调用 Circle 的复制构造函数将 this 的状态复制到新创建的 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; 
                                                          ^

但还是出现同样的错误?

谢谢

【问题讨论】:

我只是试图编译你的代码,但我没有收到错误...它真的与导致你的问题的代码完全相同吗? 【参考方案1】:
virtual void particle(const Ray& ray, const int& count) const = 0;
                                                        ^^^^^^

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

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

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

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

【讨论】:

谢谢Als - 你能解释一下原因吗?我这样做是因为我在另一个论坛上阅读过它。但他们并没有完全解释。 这很清楚。但他说他“也”尝试过这个,它“也”失败了。因此,之前,他尝试在没有这个额外的 const 的情况下进行编译。为什么那个失败了? AFAIK 他的代码可以编译并且工作正常(刚刚尝试过)。实际上,当他在基类方法的末尾添加 const 时,会导致错误......这可能是实际问题吗? @user1002744:我希望答案解释得很好。只要您删除 const 并具有与 Base 类中完全相同的函数签名,它就应该可以工作。 谢谢。它似乎正在工作。我现在有一个链接错误。但我会试着弄清楚。感谢您的帮助。

以上是关于无法启动抽象类,因为成员是抽象的的主要内容,如果未能解决你的问题,请参考以下文章

必须实现继承的抽象方法

抽象类和普通类的区别

12. 抽象类

Java接口和抽象类理解(New)

Java进阶学习之抽象与接口

System.MemberAccessException:无法创建 UserNotifications.UNNotificationTrigger 的实例,因为它是一个抽象类