先看下面一段代码,派生类没有重新实现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
本文深入探讨了非虚函数在派生类中的应用与特性,特别是当派生类重写基类的非虚函数时,指针调用的实际行为。通过实例分析,展示了非虚函数静态绑定的原理,以及如何通过基类指针调用派生类特有的函数版本。
394

被折叠的 条评论
为什么被折叠?



