当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义

 

在编译时进行名字查找:

一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的,即使静态类型与动态类型不一致:

 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 }
View Code

相关文章: