当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义
在编译时进行名字查找:
一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的,即使静态类型与动态类型不一致:
1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 // A(); 7 // ~A(); 8 ostream& print(ostream& os) const { 9 os << x; 10 return os; 11 } 12 13 protected: 14 int x; 15 }; 16 17 class B : public A{ 18 public: 19 // B(); 20 // ~B(); 21 ostream& f(ostream &os) const { 22 os << y; 23 return os; 24 } 25 26 private: 27 int y; 28 }; 29 30 int main(void) { 31 B b; 32 33 b.f(cout) << endl;//正确,b的动态类型和静态类型都是B,B::f对b是可见的 34 35 A *a = &b; 36 // b->f(cout) << endl;//错误,静态类型是A,B::f对A的对象是不可见的 37 38 B *p = &b; 39 p->f(cout) << endl;//正确,静态类型是B,B::f对B的对象是可见的 40 41 return 0; 42 }