我正在经历这个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/