一、看一个隐藏non-virtual函数的例子
假设class D以public的方式继承于class B,代码如下:
class B {public:void mf();};class D :public B {};int main(){D x;B *pB = &x;pB->mf(); //调用B::mf()D *pD = &x;pD->mf(); //调用D::mf()return 0;}
二、静态绑定与动态绑定
关于静态绑定、动态绑定的概念之前,大家先了解下静态类型的类变量和动态类型的类变量概念和区别。
静态类型的类变量:在编译时就已经知道是什么类型的了
动态类型的类变量:自己所指的类型不明确,直到运行时才知道
如果表达式既不是引用也不是指针,那么其就没有静态类型和动态类型的概念,因为其只能与自己类型一致的对象绑定到一起
演示案例
当我们使用基类的引用(或指针)时,我们并不清楚该引用(或指针)所绑定的对象的真实类型,该对象可能是基类的对象,也可能是派生类的对象。只有在程序运行的时候我们才知道所绑定的对象的真实类型
class A {}; class B:public A{}; int main() { A a;