对数函数定义
7132023-11-26
大家好,关于虚继承和虚函数继承分别指什么很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于多重继承不建议使用的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
本文目录
多态是指同样的消息被不同类型的对象接收时导致完全不同的的行为。有虚函数的类才能叫多态类型的类,可以从探索虚函数是如何实现动态绑定的来了解如何实现多继承中的多态。
单继承时虚函数动态绑定的实现原理每个类各有一个虚表(虚函数表),虚表的内容是由编译器安排的。c++语言并没有规定虚函数表的内容。派生类的虚表中,基类声明的虚函数对应的指针放在前面,派生类新增的虚函数的对应指针放在后面,这样一个虚函数的指针在基类虚表和派生类虚表中具有相同的位置。每个多态类型的对象中都有一个指向当前类型的虚表的指针,该指针在构造函数中被赋值。当通过基类的指针或引用调用一个虚函数时,就可以通过虚表指针找到该对象的虚表,进而找到存放该虚函数的指针的虚表条目。将该条目中存放的指针读出后,就可获得应当被调用的函数的入口地址,然后调用该虚函数,虚函数的动态绑定就是这样完成的。
如下图所示:
由上图可以看到基类Base有f(),g()函数,派生类还有新增的h()函数,那么这种单继承的虚函数实现动态绑定的方式是这样的:
从这张超大图片可以看到,每个Base对象都有一个指向Base的虚表的指针,虚表存放着指向每个函数的指针,这些指针存放着对应函数的地址,这样通过虚表指针就能找到虚表,通过虚表就能找到函数指针,通过函数指针就能找到函数,这样虚函数的动态绑定就完成了。派生类Base2也一样。
温馨提示:执行一个类的构造函数时,首先被执行的是基类的构造函数,因此构造一个派生类的对象时,该对象的虚表指针首先会被指向基类的虚表。只有当基类构造函数执行完后,虚表指针才会被指向派生类的虚表,这就是基类构造函数调用虚函数时不会调用派生类的虚函数的原因。
在多继承时,情况会变得更加复杂,因为在多继承时,情况会更加复杂,因为每个基类都有各自的虚函数,这样继承了多个基类的派生类需要多个虚表(或一个虚表分为多段,每个基类的虚表指针指向其中一段的地址。因为有些编译器把多个虚表连成一个)如图所示:派生类Base3公有继承了Base,Base2,那么虚函数动态绑定的实现方式是这样的:
提示:多重继承时,派生类新增的成员放在第一个表,比如上图Base3()的虚表的m()指针。
事实上,一个类的虚表中存放的不只是虚函数的指针,用于支持运行时类型识别的对象的运行时类型信息也需要通过虚表来访问,只有多态类型有虚表,因此只有多态类型支持运行时类型识别。
以上就是我的回答,有不同意见的欢迎来讨论,喜欢我的回答请关注,我们一起学习。是指:派生自同一个基类的不同类的对象具有一些共同特征“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。另外,为子类追加新的属性和方法也是常见的做法。有些编程语言支持多重继承,即一个子类可以同时有多个父类,比如C++编程语言;而在有些编程语言中,一个子类只能继承自一个父类,比如Java编程语言,这时可以利用接口来实现与多重继承相似的效果。在c++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。
虚拟继承是多重继承中特有的概念,是为解决多重继承的。
用虚继承可以节省内存空间虚函数是面向对象多态性的主要方式,通过继承基类中的虚函数在子类中重载实现不同操做。继承的虚函数在子类中不需要加virtual,默认就是虚函数。可以被它的子类覆盖。继承是面向对象程序设计的三大特征,继承具有如下特点,其成划分了类的层次性,父类代表的是更一般更泛化的类,而与类则是更为具体,更为细化,继承是实现代码。重用扩展软件功能的重要手段子类中与父类完全相同的属性和方法不必重写,只需要写出新增或改写的内容,这就是说子类可以服用妇类的内容。不必一切从零开始,多重继承要利用接口来实现。
好了,关于虚继承和虚函数继承分别指什么和多重继承不建议使用的问题到这里结束啦,希望可以解决您的问题哈!