继承与多态常见问题

                                    继承与多态常见问题

1.派生类内存布局,继承了基类什么东西
是先基类后派生类,并且继承了名字作用域和除析构构造以外的所有方法

2.继承的东西访问限定,(就是限定的取最小值(4种),基类private是不可见)

3.派生类对象的构造方式   Derive d(10)
(调用base成员对象构造函数(Base初始化列表里面),在Base构造函数),在Derive的成员对象构造函数,在Derive()。

4.基类派生类同名成员方法的关系
重载  基类自己或者派生类自己
覆盖  virtual加入 达成覆盖同名同参数函数覆盖  (这就是call eax)
隐藏  基类与派生类

5.c++支持的四种类型强转
const_cast:去掉const属性   const_cast<char *>
static_cast:可以支持的强转
reinterpret_cast:类似c强转
dynamic_cast:RTTI强转

6.
基类-》派生类对象 no
派生类-》基类对象 yes
基类指针(引用)-》派生类对象 yes
派生类指针(引用)-》基类对象 no

7.虚函数-》多态
虚函数表:  RTTI(这个表指针所在对象的类型)虚函数指针偏移量 虚函数的地址
动多态运行时候才能决定的

8.什么情况下会产生多态的编译/调用(有地址有对象)
用谁的表使用谁的虚函数表中的地址

9.纯虚函数->抽象类(抽象类不能定义对象只能定义指针引用)
virtual void bark()=0;不提供实现,派生类可以自己写实际的函数,抽象类不提供对象构造函数

10继承多态常见笔试题分析
*基类不是虚函数,派生类是虚函数,当用基类指针调用就不会发生多态,隐藏关系。000  
这样做容易产生错误,派生类用自己的虚函数指针不是继承而来的,这样虚函数指针
不在Base作用域,这样释放的时候会从Base首开始释放少释放一个vfptr(Derive的)
*一定要让Base-》show编译器看到调用的show是一个vitual函数否则他就会直接静态绑定
无论Base中是否含有虚函数表(编译器只看指针的类型这个时候因为RTTI只有在运行才能看见)
*一般析构函数在需要多态情况下写成vitual,因为如果不写,我们用base*调用~base()一旦不是
vitual就直接写地址了不会产生覆盖关系了。这就产生了问题。(这种情况首先我们new了一个派生类
地址给与了基类指针这种情况就基类必须写virtual析构函数)
*我们把基类在构造时候清空,基类无法在使用这个表派生类可以。(因为这个表是在调用对象构造函数时候栈针开辟
完成以后都会构造这个表,基类没有派生类自己构造,基类有派生类再复制一份表添加自己的覆盖函数)
*在构造和析构函数里面调用虚函数不会发生动态绑定
*private只会在编译时期起作用。
*虚函数尽量不要做默认值参数,这样多态会在编译时期就压立即数。很容易出错
*Teacher *pt=dynamic_cast<Teacher *>(p);动态强转类型是就转不是返回NULL

11.多重继承  (虚继承虚基类)
虚继承会在原来基类的地方产生vbptr(第一行是向上偏移量(距离这个小作用域开始的偏移量),第二行是原先基类数据向下多少偏移可以找到),基类数据
移到最后面。  如果这样做必须要把a的构造在d的初始化列表中添加,因为这意味着abc对于d而言都是同等的。但a要最先
构造。d如果自己虚继承前面的就要把表与前面的合并。

猜你喜欢

转载自blog.csdn.net/qq_41784469/article/details/80772388