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()这样就绕过了同名隐藏的坎;
以上纯属个人基于编译器实验的猜测,如有错误,请不吝指教;
- C++动态联编的好处,为什么要用基类的指针指向派生类的方式来实现重写
- 为什么基类指针指向派生类是安全的,而派生类指向基类则是不安全的
- 指向派生类型的指针
- 为什么要用基类指针指向派生类对象?
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 基类指针、派生类指针指向基类对象和派生类对象的4种方式
- 基类指针指向派生类是安全的,而派生类指向基类则是不安全的
- C指针的好处
- 基类的指针指向派生类的对象
- 【C++】指向类的指针
- 关于指向派生类的基类指针或引用
- c 指向指针的指针
- C 指向指针的指针
- 为什么有指向指针的指针?
- 为什么要使用指向指针的指针
- 单链表为什么用指向指针的指针
- 基类指针静态强制转为派生类指针,基类指针必须指向派生类的基类子对象????
- C指针---指向指针的指针(转)
- 计算机控制技术课程简介与资料
- 漫步微积分二十九——微积分基本定理
- C++函数指针、函数对象与C++11 function对象对比分析
- HDU 1075 What Are You Talking About
- MFC 线程同步
- C++动态联编的好处,为什么要用基类的指针指向派生类的方式来实现重写
- Eclipse C++ 开发环境搭建
- A64
- Intent和Intent Filter
- 腾讯实习题---删除最少字符成为回文
- 关于对象转JSON
- #发现 # 好的设计
- 下面的书籍有空 看一下,争取每天晚上睡觉看10页书
- 将带E的double转化为不带E的