C++动态联编的好处,为什么要用基类的指针指向派生类的方式来实现重写

来源:互联网 发布:阿里巴巴的云计算 编辑:程序博客网 时间:2024/04/28 00:39

动态联编的意义:省事
一个derived类对象,要调用一个函数,他就会在自己的类中查找函数名,如果找到了就调用自己的;
如果没找到就到基类找,调用基类的函数。(名字查找优先于类型检查,找到名字符合的就停下来,不向上一个基类的作用域继续找)。 但是常常基类的函数会调用其他基类的函数,但是我们想要改写其中的一两个函数怎么办呢?要么你直接把基类函数代码拷过来一段,修修改改,一顿操作,要么就把要修改的那个函数弄成虚函数,下面重写一下:

为什么要用指针或引用:
1、指针或者引用操作时,派生类的虚表会被给过去(这才是重点),这个指针就能按照这个虚表调用虚函数。
2、默认的赋值运算符并不会操作虚函数表。所以要实现多态,必须使用指针或者引用。

为什么要用基类指向派生类这种方式:
为了跳过同名隐藏这一道坎,使用基类指针变成调用虚函数变成从上往下找;
A类有一个虚函数fun(),
B继承自A,并且B有一个fun(int)函数隐藏(参数列表不一样就隐藏了)了A::fun(虚函数)
C继承自B,B重写了fun()函数(参数列表和A一样)。

情况 1:
A a ,B b,C c ;A* pa =&a, pb =&b,pc=&c;
这种情况下 通过pa->fun() 调用基类 fun。
通过pb->fun() 调用的也是基类fun,因为B没有重写,而指针调用只与类型有关,
所有不管B的fun(int),pb->fun(“int”)甚至会报错,基类没有这样的函数;

情况2:
A a ,B b,C c B* pb = &b;A* pa;
pb->fun ( );你想这样调用,实际上是不可能的。虽然按理说你没重写,依旧可以调用基类的fun,
但是同名隐藏了,编译器从下往上找,找到就停了。这就是为什么要用基类指向派生类这种方式来实现动态联编;
通过pa->fun() 会调用a的 fun()这样就绕过了同名隐藏的坎;

以上纯属个人基于编译器实验的猜测,如有错误,请不吝指教;

0 0
原创粉丝点击