静多态与动多态

一:如何判断静多态和动多态

1.动多态底层call的是寄存器,而静多态底层call的是函数入口地址

二:成为虚函数的条件

1.可以取地址,即inline内联函数不可以

2.必须依赖对象调用,因为虚函数表是通过对象内存布局的vfptr指向的,即static,构造函数不可以成为虚函数

3.析构就可以成为虚函数

三:动多态

1.对象调用虚函数发生的并不是动多态,只有指针调用时才会发生动多态。

2.以指针方式调用虚函数时会发生动多态

3.在构造函数中,调用this指针调用虚函数发生的是静多态,因为在构造函数中对象仍然不完整,构造函数还未调用成功,对象还不存在,所以    也就是说发生动多态时必须要完整的对象调用虚函数才会发生动多态

4.析构函数一进入对象就不再完整,只要进入析构函数,就会发生静多态

5.Base* pb=new Derive(10);  pb->Show();  delete pb;   如果基类的析构函数不是虚函数 在这种情况下,会只析构掉派生类中父类的那部分,从而导致内存泄漏  

6.继承关系中,析构函数和同名函数的覆盖是相同的,两个析构名字不同但是仍然覆盖

四:虚表、虚指针

1.虚表的写入时机(什么时候vfptr指向vftable):构造函数第一行代码之前

扫描二维码关注公众号,回复: 5971543 查看本文章

虚表会有两次写入,在基类构造中写入一次    在派生类构造中写入一次    虚表在编译器间生成

五:纯虚函数

1.纯虚函数的设计:将接口预留出来但是并没有实现 

例如:动物类都有叫声 但是只有确定到某种动物才会知道它的叫声是什么

拥有纯虚函数的类称为抽象类

2.抽象类不能生成对象,只能通过指针/引用来使用该类  

3.在派生类中对于纯虚函数不是实现相当于派生类中也有该接口,派生类也会变成抽象类

六:虚基类

1.有虚基类继承时内存布局的画法:非虚的布局,虚基类的布局,派生类的布局最后将虚基类放到最后虚基类部分补vbptr

2.虚基类的构造优先级最高,有继承虚基类的派生类对象构造时,最先时虚基类的构造,其次是普通基类的构造,最后的才是派生类自己部分的构造

3.派生类虚继承基类时不建议使用基类指针指向派生类

因为 例如:

上面这种情况在构造时,从vbptr处new一块空间但是delete时 Base*指针从基类部分析构,导致派生类部分无法析构出现内存泄漏

当加入虚析构的时候,内存布局就会变成图   并无意义 所以不建议使用基类指针指向派生类

猜你喜欢

转载自blog.csdn.net/Monster7559/article/details/88068136
今日推荐