2016 - 2024

感恩一路有你

递归和非递归哪个效率高 设置虚基类的目的?

浏览量:2524 时间:2021-03-12 10:59:09 作者:admin

设置虚基类的目的?

其目的是消除歧义。

当多个继承路径上存在公共基类时,在多个路径的汇合处,公共基类将生成多个实例(或多个副本)。如果只想保存基类的一个实例,可以将公共基类描述为虚拟基类。

虚拟基类的基本原则是在内存中只有其成员的一个副本。这样,通过将基类继承声明为虚继承,只能继承基类的一个副本,从而消除了歧义。使用虚拟限定符将基类继承描述为虚拟的。

怎样理解c 中的虚基类和虚函数.纯虚函数?

虚拟函数和纯虚拟函数有以下区别。(1) 如果在类中声明了虚函数,则即使该函数为空,也会实现该函数。它的目的是使函数能够包含在其子类中。这样,编译器就可以使用后期绑定来实现多态性。纯虚函数只是一个接口,一个函数的声明,需要在子类中实现。(2) 虚拟函数不能在子类中重载,但是纯虚拟函数必须在子类中实现,就像Java接口一样。一般来说,在许多函数中添加虚拟元素是一个好习惯。虽然牺牲了一些性能,但是面向对象的多态性增加了,因为很难预测父类中的函数不在子类中,并且它的实现不会被修改。(3) 虚函数类用于“实现继承”,不仅继承接口,而且继承父类的实现。当然,你也可以完成你自己的实现。纯虚函数注重接口的统一性,通过子类实现。(4) 具有纯虚函数的类称为虚基类。这种基类不能直接生成对象。只有继承并重写虚拟函数后才能使用。这样的类也称为抽象类。在任何非虚拟基类构造函数之前调用虚拟基类的构造函数。如果构造中包含多个虚拟基类,则它们的调用顺序为声明顺序。如果虚拟类是从非虚拟类派生的,则首先调用非虚拟类的构造函数。

下面是一个示例:

class X:public y,virtual public Z

X one

调用顺序如下:

Z()//虚拟基类初始化

y()//非虚拟基类

X()//继承类

有虚基类时,多继承构造函数调用顺序?

,即,编译器无法确认您是否在D中。在f()中调用哪个函数f。这可能会让人觉得有点奇怪。命名只定义了一个CA::F。因为每个人都从CA派生,所以它自然地被称为CA::F。为什么我们不能确定呢?

这是因为编译器在编译时需要确定子类的函数定义。例如,确定CA::F。然后,在编译CB和CC时,它还需要在编译器的语法树中生成CB::F、CC::F和其他标识符。然后,在编译CD时,由于CB和CC有一个函数f,编译器将尝试生成这两个CD::f标识符。很明显,此时会报告错误,为时已晚。

(当我们不使用CD::F时,不会生成上述任何标记,因此如果我们删除D.

要解决此问题,有两种方法:

1。重载函数f():此时由于我们已经明确定义了CD::f,编译器在检查CD::f()调用时不需要一步一步生成CD::f label;

此时CD的元素结构如下:| CB(CA)|

]| CC(CA)|

,所以sizeof(CD)=8(CB和CC各有一个元素K)

2。使用虚拟继承:虚拟继承也称为共享继承。这种共享实际上是在编译过程中实现的。当使用虚拟继承时,上面的程序将变成如下形式:class ca.

什么叫做虚基类?

当派生类继承基类时,添加一个virtual关键字就是virtual基类继承,如:类派生:虚公共基类{}虚基类主要解决基类在多次继承中可能被多次继承的问题,虚基类主要为派生类提供基类,如:类B{}类D1:公共B{}类D2:公共B{}类C:公共D1,公共D2{},其中C继承自D1和D2,但有两个基类,这会造成混淆。所以我们使用虚拟基类,即:类B{}类D1:虚拟公共B{}类D2:虚拟公共B{}类C:公共D1,公共D2{}

递归和非递归哪个效率高 虚基类是什么意思 虚基类的作用

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。