让编译器告诉哪些方法不具体而不是错误的'抽象类类型的无效新表达式'

时间:2018-02-21 09:33:04

标签: c++ abstract-class virtual-method

每次我向抽象类添加一个非具体的虚方法时,编译器会对从该抽象类派生的所有类提供无用的错误invalid new-expression of abstract class type '...',然后我需要执行git diff搜索我之前添加的新方法,或查找GCC错误中的注释。 (添加方法和编译之间可能存在天差异)

我可以在C ++中指定一个类必须是具体的(如果它没有告诉cause / missing方法)?

1 个答案:

答案 0 :(得分:2)

回答手头的问题:

  

我可以在C ++中指定一个类必须是具体的(如果它没有告诉cause / missing方法)?

C ++没有明确的抽象具体的类。这些概念隐含在语言中。 Abstract 由一个或多个纯虚拟成员函数的存在(在类本身或继承中)隐含,而具体由于缺少这些函数而隐含。

这正是C ++标准定义抽象类(§13.4/ 2)的方式

  

[class.abstract]

     

抽象类是一个只能用作其他类的基类的类;除了作为派生自它的类的子对象之外,不能创建抽象类的任何对象。 如果一个类至少有一个纯虚函数,则该类是抽象的。

例如,在C ++中没有像Java ;WITH x AS ( SELECT ENTRY_DATE, ID, PRICE, RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ENTRY_DATE DESC) FROM TableName WHERE '20100105' <= ENTRY_DATE ) SELECT ENTRY_DATE, ID, PRICE FROM x WHERE RN = 1 UNION SELECT a.ENTRY_DATE, a.ID, a.PRICE FROM ( SELECT ENTRY_DATE, ID, PRICE, RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ENTRY_DATE DESC) FROM TableName ) a LEFT JOIN x ON a.ID = x.ID WHERE a.RN = 1 AND x.ID IS NULL 这样的关键字。

编译器错误消息是您可以捕获错误的标准位置,例如尝试实例化仍具有纯虚拟成员函数的类。