我正在经历这个Book,我无法解决这个问题:

如果B::f(int)隐藏了A::f(),为什么pa1->f();没有给出错误?

隐藏名称不是意味着f()中不存在函数class B吗?而且,如果pa1指向class B的对象,则pa1->f();应该会像b.f()一样导致错误!

请对此进行解释,因为我无法通过这本书理解它!
提前致谢!

#include <iostream>
using namespace std;

struct A {
   virtual void f() { cout << "Class A" << endl; }
};

struct B: A {
   void f(int) { cout << "Class B" << endl; }
};

struct C: B {
   void f() { cout << "Class C" << endl; }
};

int main() {
   B b; C c;
   A* pa1 = &b;
   A* pa2 = &c;
//   b.f();
   pa1->f();
   pa2->f();
}

最佳答案



因为pa1指向A,并且A有一个名为f的成员,可以这样调用。在这种情况下,其他任何类(包括B)都无关紧要。



否。这意味着在B的上下文中,唯一可以通过不合格查找找到的名为f的函数就是B::f。它不会从任何其他上下文中删除f,也不会阻止通过合格查询(例如b.A::f())找到它。



动态类型是B,所以这是(在运行时)用于调用虚拟函数的类型。编译器根据静态类型A选择非虚拟函数。通常,编译器不知道动态类型。它所知道的只是指针指向A或一些未知的派生类。

关于c++ - 基类的继承和指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18849578/

10-12 18:22