• C++是怎么实现多态性的


    C++是怎么实现多态性的,C++中多态实现的原理,

    当一个类中有虚函数时,系统会为该类构造一个虚函数表vtable,他是一个指针数组,存放每个虚函数的入口地址,编译器还会在此类中隐含插入一个指针vptr指向虚函数表,调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr与vtable的关联代码,将vptr指向对应的vtable,将类与此类的虚函数表联系了起来,以后调用虚函数时,就是通过虚函数表调用虚函数,在基类中定义了虚函数之后,在派生类中可以对虚函数惊醒重新定义,赋予它新的功能,然后就可以用指向基类的指针去调用虚函数,此时调用的就是指针变量指向的对象的同名函数。

    试图用基类指针去解决二义性问题:行不通,在前面,我们不用虚基类,而是定义一个指向基类的指针,然后每次访问之前对这个指针变量进行赋值,那么这样还会存在二义性的问题吗。好像还是会存在二义性的问题,例如A是共同基类,然后B C是A的直接派生类,然后以B C作为基类派生出D类,那么对于A中的成员函数,D继承了两份,一个是从B继承得到,另一份是用C类继承得到,这个时候你就算是定义一个指向基类的指针,然后把D的地址赋给这个指针变量,那么当用这个指针去调用成员函数的时候,好像还是要加作用于运算符进行限定,要不然你不知道你访问的是派生类D从 B C哪个类中继承的成员函数。所以并不是像你想的那样,用了虚函数之后就根本不用虚基类了,不是的,虚函数是虚函数,虚基类是虚基类,用了虚函数之后还是要用虚基类,要不然还是会存在二义性的问题,

    在一个类中保留间接共同基类的多份同名成员,虽然有时是有必要的,可以在不同的数据成员中分别存放不同的数据,也可以通过构造函数分别对他们进行初始化,但是在大多数情况下,这种现象是人们不希望看到的,因为保留多份数据成员的拷贝,不仅占用较多的存储空间,还增加了访问这些成员的困难,容易出错,而且实际上,并不需要有多份拷贝,因此C++提供虚基类的方法,使得在继承间接共同基类时只保留一份成员。

    作者:cumtchw
    出处:http://www.cnblogs.com/cumtchw/
    我的博客就是我的学习笔记,学习过程中看到好的博客也会转载过来,若有侵权,与我联系,我会及时删除。

  • 相关阅读:
    jquery通过live绑定toggle事件
    svn is already locked解决方案
    不安全代码只会在使用 /unsafe 编译的情况下出现
    eclipse 新建 java 文件时自动生成注释
    浅谈权限设计
    ie6/IE8/IE9/谷歌以及火狐等浏览器下li 高度一致解决办法
    PHP+MSSQL TEXT字段被截断的解决方案
    利用CSS让dl dt dd呈现多行多列效果
    CSS实现图片水平垂直居中于DIV
    CSS 关于IE6 margin 为负数 负值的时候 正常显示的方法
  • 原文地址:https://www.cnblogs.com/cumtchw/p/4726591.html
Copyright © 2020-2023  润新知