如何处理 C++ 中的“无法实例化抽象类”错误?我在这里查看了一些类似的错误,但它们似乎都不是我遇到的完全相同或问题。但是,话又说回来,我承认有几个要过去。这是编译错误:
这将我带到此页面:http: //msdn.microsoft.com/query/dev10.query ?appId=Dev10IDEF1&l=EN-US&k=k(C2259);k(VS.ERRORLIST)&rd=true 编译错误 C2259 来自一个 C++ 程序,但页面将抽象类称为“接口”:
每当您从接口派生并在派生类中以公共以外的访问权限实现接口方法时,您可能会收到 C2259。发生这种情况是因为编译器希望派生类中实现的接口方法具有公共访问权限。当您为具有更严格访问权限的接口实现成员函数时,编译器不会将它们视为接口中定义的接口方法的实现,从而使派生类成为抽象类。
该问题有两种可能的解决方法:
为实现的方法公开访问权限。
对派生类中实现的接口方法使用范围解析运算符,以用接口名称限定实现的方法名称。
坏消息是我已经在类中公开了所有方法:
class AmbientOccluder: public Light {
public:
AmbientOccluder(void);
原文由 xarzu 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果有人从函数中收到此错误,请尝试在参数中使用对抽象类的引用。
至
不能构造一个抽象类,即使是从一个子类。抽象类基本上是其他类的模板,它们本身没有构造函数。这是实现涉及继承的接口的另一种方式。
网上有很多关于多态的东西,而且都是愚蠢的。 C++ 使您可以同时从多个类继承,因此抽象类和接口在那里是相同的。我认为抽象类存在的原因是因为某些语言,如 Java,只能从一个类继承/扩展。
抽象类实际上是一个抽象概念。他们是班级的家长,但仅限于我们的脑海中。它们是对没有正确答案的问题的答案。比如,“GTA 的前身是什么?”你会说,“嗯,有 Race n’Chase”,但这甚至不是一个正确的答案,因为它们是同一个游戏,只是名称改变了。抽象类是“该类的父类是什么”的答案?就像你可以说“哦,字符串只是一个字符数组”和“一个字符数组只是几个迭代器”和“迭代器只是指针”。抽象类允许我们将这些愚蠢的答案形式化为继承。