为什么必须使用继承类的全名调用具有相同名称(不是签名)的基类上的方法?

TCS

这是一个理论问题,目的只是为了更好地理解为什么不支持以下情况。

查看以下代码:

class A
{
public:
    A(){}

    void f(int x){ printf("A::f(x)\r\n"); }
    void g(int x){ printf("A::g(x)\r\n"); }
};

class B : public A
{
public:
    B(){}

    void f(){ f(5); } // <- does not compile
    void f(){ A::f(5); } // <- compiles
    void f(){ g(5); } // <- compiles
};

B类继承A类。

当B :: f()通过不使用其全名(即void f(){f(5);})调用A :: f()时,B :: f()无法编译,因为它找不到函数A :: f(int)。问题是为什么?

使用全名(显然有帮助... void f(){A :: f(5);})。但是真正使它变得怪异的是void f(){g(5); }有效!

我确实理解这是因为f()在A和B中都实现了,但是为什么编译器不能自己理解该方法在类A上呢?

谢谢!

ps我的猜测是,也许f()不仅在A中实现,而且可能在A的基类中实现,所以在这种情况下,编译器无法真正知道,但是正如我所写的,我只是在猜测...

凯文

编译器将首先通过名称查找函数,而忽略参数。因此它看到B::f()然后开始尝试匹配参数。由于不B::f()带任何参数,编译器将引发错误。调用时,g()没有匹配项,B因此编译器会查找A并找到它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在异构类的实例上循环以调用具有相同名称和参数的方法?

来自分类Dev

具有相同名称的类的构造方法继承

来自分类Dev

为什么要使用继承和多态性而不是函数模板实例来调用具有相同签名的成员函数?

来自分类Dev

基类中具有相同名称但签名不同的非虚拟函数

来自分类Dev

用具有相同名称的(无作用域的)基类枚举初始化派生类枚举

来自分类Dev

正确使用具有相同名称的表单的方法

来自分类Dev

为什么内部类方法隐藏所有具有相同名称的封闭类方法?

来自分类Dev

如果部分类继承自某个类,那么所有其他具有相同名称的部分类也应该继承相同的基类吗?

来自分类Dev

C#多态性:获取具有相同名称的派生类的属性,而不是基类的字段

来自分类Dev

创建新的类,该子类继承具有相同名称的现有类

来自分类Dev

如何从具有相同名称IsTesting()的类方法中调用内置函数IsTesting()?

来自分类Dev

如何从具有相同签名的 main 调用基类函数?

来自分类Dev

具有相同名称的类和方法变量的行为

来自分类Dev

如果具有相同名称的字段从两个来源(类和接口)继承,将会发生什么

来自分类Dev

继承具有相同名称空间和相同类名的类

来自分类Dev

继承具有相同名称空间和相同类名的类

来自分类Dev

在Ruby中调用具有相同名称的函数和方法

来自分类Dev

在Ruby中调用具有相同名称的函数和方法

来自分类Dev

使用字符串内容调用具有相同名称的函数

来自分类Dev

如何禁用外部CSS类的属性并在HTML中使用具有相同名称但不同属性的内部CSS类

来自分类Dev

是否可以在继承的类中公开具有相同名称的受保护常量?

来自分类Dev

Java继承混乱,具有相同名称的超类和子类成员变量

来自分类Dev

为什么鼠标悬停和移出不适用于所有具有相同名称的类?

来自分类Dev

当类具有相同名称的方法时,如何获取从元类派生的绑定方法

来自分类Dev

使用类名称来调用相同名称的变量

来自分类Dev

C ++多态性-调用具有不同签名的派生类方法

来自分类Dev

C ++使用具有未知基类的多重继承比较指针

来自分类Dev

Angular指令和具有相同名称的CSS类

来自分类Dev

类名和具有相同名称的变量的声明

Related 相关文章

  1. 1

    如何在异构类的实例上循环以调用具有相同名称和参数的方法?

  2. 2

    具有相同名称的类的构造方法继承

  3. 3

    为什么要使用继承和多态性而不是函数模板实例来调用具有相同签名的成员函数?

  4. 4

    基类中具有相同名称但签名不同的非虚拟函数

  5. 5

    用具有相同名称的(无作用域的)基类枚举初始化派生类枚举

  6. 6

    正确使用具有相同名称的表单的方法

  7. 7

    为什么内部类方法隐藏所有具有相同名称的封闭类方法?

  8. 8

    如果部分类继承自某个类,那么所有其他具有相同名称的部分类也应该继承相同的基类吗?

  9. 9

    C#多态性:获取具有相同名称的派生类的属性,而不是基类的字段

  10. 10

    创建新的类,该子类继承具有相同名称的现有类

  11. 11

    如何从具有相同名称IsTesting()的类方法中调用内置函数IsTesting()?

  12. 12

    如何从具有相同签名的 main 调用基类函数?

  13. 13

    具有相同名称的类和方法变量的行为

  14. 14

    如果具有相同名称的字段从两个来源(类和接口)继承,将会发生什么

  15. 15

    继承具有相同名称空间和相同类名的类

  16. 16

    继承具有相同名称空间和相同类名的类

  17. 17

    在Ruby中调用具有相同名称的函数和方法

  18. 18

    在Ruby中调用具有相同名称的函数和方法

  19. 19

    使用字符串内容调用具有相同名称的函数

  20. 20

    如何禁用外部CSS类的属性并在HTML中使用具有相同名称但不同属性的内部CSS类

  21. 21

    是否可以在继承的类中公开具有相同名称的受保护常量?

  22. 22

    Java继承混乱,具有相同名称的超类和子类成员变量

  23. 23

    为什么鼠标悬停和移出不适用于所有具有相同名称的类?

  24. 24

    当类具有相同名称的方法时,如何获取从元类派生的绑定方法

  25. 25

    使用类名称来调用相同名称的变量

  26. 26

    C ++多态性-调用具有不同签名的派生类方法

  27. 27

    C ++使用具有未知基类的多重继承比较指针

  28. 28

    Angular指令和具有相同名称的CSS类

  29. 29

    类名和具有相同名称的变量的声明

热门标签

归档