多态的概念,多态的原理,多态解决什么问题

多态的概念,多态的原理,多态解决什么问题,第1张

目录

一.多态能解决什么问题

二.多态的概念

三,多态的原理


一.多态能解决什么问题

问题:通过基类指针只能访问派生类的成员变量,不能访问派生类的成员函数

(包括析构函数也不能访问)----(这也是为什么需要虚析构函数)

例如:

    Parent p;

    Child c;

    p = c;

    p.show();

简单说Parent为基类  Child是Parent的派生类  我定义了派生类Child c  在将其赋值给基类p. 然后调用p.show()  按照正常的思维来讲应该调用的是派生类Child 的函数show()   但是实时并不如此p.show()  调用的是基类Parent的函数;

为什么会出现这样的问题?

答:

        赋值的本质是将现有的数据写入已分配好的内存中,对象的内存只包含了成员变量,所以对象之间的赋值是成员变量的赋值,成员函数不存在赋值问题。运行结果也有力地证明了这一点,虽然有p=c;这样的赋值过程,但是 p.show() 始终调用的都是 基类Parent的 show() 函数。换句话说,对象之间的赋值不会影响成员函数,也不会影响 this 指针。

二.多态的概念

在这里不得不提一下多态的核心三要素
        1.要有继承
        2.派生类中要有虚函数重写
        3.要由基类指针指向派生类对象,通过指针调用派生类对象的虚函数

多态的概念:

           基类指针可以按照基类的方式来执行对应功能,也可以按照派生类的方式来执行对应功能,他有多种形态,或者说多种表现形式,我们将这种现象称为多态;            

-----如果没有多态就会出现 上面的问题 只能执行基类的方法不能访问派生类方法; 

c++提供多态有什么目的呢:
        答:他可以通过基类指针对所有的派生类(包括直接派生和间接派生)的成员变量和成员函数进行"全方位"访问,尤其是对成员函数,如果没有多态,只能访问成员变量

三,多态的原理

  在类中声明虚函数时,编译器会在类中声明一个虚函数表,虚函数表是一个存储类成员函数的指针的数据结构,是由编译器自动生成与维护的,类中的虚函数成员会被编译器放入虚函数表中
     当存在虚函数时每一个对象中都有一个指向虚函数表的指针,他一般作为类对象的第一个成员,这样可以是虚函数调用快一些当进行函数调用是,c++编译器不需要区分子类对象或者父类对象,只要通过基类指针找到虚函数指针,在通过该指针在虚函数表中找到对应的函数即可

简单来说就是  通过基类指针---找到对应的虚函数表指针-----调用对应的虚函数表里面的函数

随便写写  有错误的地方 欢迎指正

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/3002604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存