class B { public: void mf(); ... }; class D: public B { ... void mf(); // 1. 重定义基类中的non-virtual成员函数 }; D x; B *pB = &x; D *pD = &x; pB->mf(); // 调用的都是x的mf函数,若结果不一样,你是否 pD->mf(); // 会奇怪?其实没什么,这类函数都是静态绑定
虚函数才是动态绑定,在运行时根据指针指向的对象的实际类型,决定调用的函数。
引用和指针是一样的,对于非虚拟函数,都是静态绑定。
一个“非虚拟”函数就意味着,某个类体系都要有这样一个共同的行为,所以在设计上重定义非虚拟函数也是错误的,会误导客户。
Item 7说过,多态的dtor也要虚拟,和本文是一样的道理,都是不希望函数被静态绑定。
本文探讨了C++中虚函数与非虚函数的区别,重点讲解了静态绑定与动态绑定的概念。对于非虚函数,无论通过基类指针还是派生类指针调用,都会调用到定义时的函数版本,这称为静态绑定。而虚函数则能在运行时根据对象的实际类型来确定调用哪个版本的函数,即动态绑定。
244

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



