先看下面一段代码,派生类没有重新实现non-virtual函数print函数:
- #include <iostream>
- using namespace std;
- class Base
- {
- public:
- void print()
- {
- cout <<" invoked from Base" << endl;
- }
- };
-
- class Derived: public Base
- {
- public:
- //void print()//隐藏了Base::printf函数
- //{
- // cout <<" invoked from Derived" << endl;
- //}
- };
-
- int main()
- {
- Derived d;
- Base *base = &d;
- Derived *derived = &d;
- base->print();
- derived->print();
- }
运行结果:
这个结果很明显,在此不做解释。
但是如果派生类又定义了自己的函数print版本:
- #include <iostream>
- using namespace std;
- class Base
- {
- public:
- void print()
- {
- cout <<" invoked from Base" << endl;
- }
- };
-
- class Derived: public Base
- {
- public:
- void print()//隐藏了Base::printf函数
- {
- cout <<" invoked from Derived" << endl;
- }
- };
-
- int main()
- {
- Derived d;
- Base *base = &d;
- Derived *derived = &d;
- base->print();
- derived->print();
- }
输出结果:
虽然两个指针都是通过对象d来调用成员函数print,但是结果却不一样。子类Derived有自己的实现版本,隐藏了父类的print函数。
为什么这种情况下会结果不一样呢?
这是因为non-virtual函数都是静态绑定。由于base被声明为一个pointer-to-Base,通过base调用的non-virtual函数永远是Base所定义的版本。即使base指向一个类型为Base派生之Derived的对象。
更多讨论请看:http://www.dewen.org/q/5477