37、绝对不要重新定义继承而来的非虚拟函数
1、静态绑定
非虚拟函数是静态绑定的,虚拟函数是动态绑定的。
在派生类中重新定义一个继承而来的非虚拟函数与一个虚拟函数,则用基类指针或派生类指针指向一个派生类对象,并通过指针来调用函数时:非虚拟函数静态绑定,由指针类型决定调用基类函数还是派生类函数;虚拟函数是动态绑定,由指向的对象类型决定基类函数还是派生类函数。
调用函数 | 基类指针 | 派生类指针 |
---|---|---|
非虚拟函数 | 基类 | 派生类 |
虚拟函数 | 派生类 | 派生类 |
2、不要重新定义继承而来的非虚拟函数
公有继承是指每个派生类对象都是一个基类对象,即:
1.适用于基类对象的事,都适用于派生类对象。每个派生类对象都是一个基类对象。
2.派生类一定会继承基类的非虚拟函数的接口和实现。
此时,若重新定义继承而来的非虚拟函数,则与“每个派生类对象都是一个基类对象”矛盾,或许不该使用公有继承;若必须使用公有继承,则该函数应该为虚拟函数。
总之,绝对不要重新定义继承而来的非虚拟函数。