条款36:绝不重新定义继承而来的非虚函数

 1 #include <iostream>

 2 

 3 using namespace std;

 4 

 5 class Base

 6 {

 7 public:

 8     void mf();

 9 };

10 void Base::mf()

11 {

12     cout << "Base::mf" << endl;

13 }

14 

15 class Derived : public Base

16 {

17 public:

18     void mf();

19 };

20 void Derived::mf()

21 {

22     cout << "Derived::mf" << endl;

23 }

24 

25 int main()

26 {

27     Derived d;

28 

29     Base* pB = &d;

30     pB->mf();           // 调用Base::mf

31     Derived* pD = &d;

32     pD->mf();           // 调用Derived::mf

33 

34     return 0;

35 }

说明:同样都指向d,但是却调用了不同的函数,原因是非虚函数是静态绑定的,即调用哪个函数是由声明时所决定的。而虚函数是动态绑定的,调用哪个函数是由运行时指向的对象决定的。

如上所述,如果重新定义了继承而来的非虚函数,那么得到的结果可能并不是你想要的;如果确实需要重新实现自己的函数版本,那么定义为虚函数好了。

 

你可能感兴趣的:(虚函数)