当前位置: 首页 > 知识库问答 >
问题:

在C++中可以使用子类名引用方法吗?

花俊雄
2023-03-14

是否允许使用B::F名称调用A对象的F方法,如下面的示例所示?

struct A { void f() {} };
struct B : A {};
int main() { A{}.B::f(); }

Clang和GCC在这里分叉。Clang对程序很好,而GCC打印错误:

error: 'B' is not a base of 'A'

演示:https://gcc.godbolt.org/z/pn7jehzdp

根据标准,哪个编译器就在这里?

共有1个答案

翟修明
2023-03-14

GCC是正确的:[class.access.base]/6要求指向.左操作数的指针能够

隐式转换为指向右操作数的命名类的指针。

术语“命名类”在[class.access.general]/5中定义;在您的示例中,它是b,显然a*不能隐式转换为b*

 类似资料:
  • 问题内容: 指这里 A是预编译的Java类(我也有源文件)B是我正在编写的Java类 B扩展了A。 如何实现逻辑,以便A可以调用B拥有的方法。 以下是条件: 我不想触摸A(尽管没有其他解决方案,但这只是最后一个选择)。 我不想使用反射。 如前所述,如果需要,我可以修改A。哪种方式可能是可行的解决方案? 问题答案: 类应该定义将要调用的方法(可能是抽象方法,根据Paul Haahr的出色指南,A应该

  • 问题内容: 我打算在我的代码中使用以获得更好的性能。 但是,出现以下错误: 我尝试了另一种方式,并收到此错误: 我的代码如下所示: 我认为由于未在main函数中使用而引起了错误。 我的猜想对吗?以及如何修改代码以修复错误? 问题答案: 问题是您在实例中有一个无法拾取的实例变量()。因为您正在调用实例方法,并且您正在Windows上运行,所以整个实例都必须是可腌制的,才能将其传递给子进程。是一个打开

  • 问题内容: 我对Java中的多态性有基本的疑问。我已经在一个名为AnimalTestDrive.java的文件中编写了以下代码。根据我的说法,以下代码应专门以粗体显示该行,但不幸的是,它不能。您能否解释为什么,我给出了以下错误: 问题答案: 让我们尝试以与编译器相同的方式查看此行: 首先,它需要弄清楚是什么意思。很好而且很容易-它是当前方法中的局部变量,因此它不需要花很多时间。 该变量的编译时类型

  • 问题内容: 为什么此SQL不起作用? 这: 子句只是从搜索点计算顺序。 我正在将其别名(因为它太长了)到“距离”。 在这里,我用冗长的短语替换了“ Distance <30”,它可以正常工作。 我什至可以对列别名进行ORDER BY,这行得通!!? 我究竟做错了什么? 问题答案: 发生这种情况是由于自然的查询处理顺序,如下所示: | 您要在语句中分配别名。如您所见,它是在处理之前和之后处理的。那就

  • 问题内容: 我想命名一个CSS类,并将其命名为imgSuper。我可以在CSS类中使用camelCasing吗? 问题答案: 从技术上讲是可以的,但是这是有风险的,因为CSS语法几乎不区分大小写,但是在某些情况下,在某些浏览器中,类名被视为区分大小写,因为规范未指定将CSS规则与HTML类匹配时浏览器应如何处理大小写名称。 从规范,4.1.3节: 所有CSS语法在ASCII范围内都不区分大小写…

  • 问题内容: 我需要在WHERE子句中使用别名,但它一直告诉我它的未知列。有什么办法可以解决这个问题?我需要选择评级高于x的记录。评分的计算方法如下: 问题答案: 您可以使用HAVING子句,该子句 可以 看到别名,例如 但是在where子句中,您需要重复您的表达式,例如 但!并非所有的表达式都被允许-使用像SUM这样的聚合函数将不起作用,在这种情况下,您将需要使用HAVING子句。 从MySQL手