今天专门看了一下虚继承的东西,以前都没怎么用过,具体如下:
父类:
class CParent
{
....
};
继承类的声明比较特别:
class CChild : virtual public CParent
{
....
}
请问,这个"virtual"是什么作用及含义?
---------------------------------------------------------------
表示虚拟继承,和普通继承是C++的两种多重继承方式。
例如CB1、CB2 继承CA 而CC多重继承CB1、CB2
如果普通继承则CC包含两份CA的拷贝,分别来自于CB1、CB2
而虚拟继承则指包含一份CA的拷贝
---------------------------------------------------------------
这个"virtual"是什么作用及含义?
证明这个CParent是CChild 的虚基类
虚基类 的 作用
虚基类是指:class SubClass : virtual public BaseClass 中以virtual声明的基类!!由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了
典型的需要用虚基类的情况如下:
A
/ \
B C
\ /
D
其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承
程序嘛…………
class A {
public:
void printA() {cout<<"this is A\n";}
};
class B:virtual public A;
class C:virtual public A;
class D:public B,public C;
这样在D构造出来后,它的存储区域中只有一个A,不会有二义性问题
比如:D d=new D;
此时若使用D.printA();不会有问题;但若B和C不是虚继承自A,就会有二义性问题
COM中 多重继承不采用虚拟继承, 否则会导致与COM不兼容的vtbl。若 IX 和 IY 按照虚拟继承方式继承IUnknown,那么 IX 和 IY 的vtbl中的头三个函数指向的将不是IUnknown的三个成员函数(详见Com技术内幕)
IUnknown -> IX
---> CA
IUnknown -> IY
通常将一种类型的指针转换成另外一种类型的指针并不会改变指针的值,但为了支持多重继承,在某些情况下,C++必须改变类指针的值。COM中的多接口继承就是如此,此时
CA* pA = new CA();
IY * pc = pA; 会被编译器改成 IY * pC = (char * )pA + deltaIY(一个偏移量);
基类的析构函数也应该定义成virtual才会在继承类的实例析构时被调用以清除基类用到的资源。
分享到:
相关推荐
在C++编程语言中,`virtual`关键字在继承语境中有着特殊的意义,特别是在处理多继承时。`virtual`继承是一种机制,它允许在派生类中只包含一个共享基类的实例,从而避免了多继承带来的重复基类问题,也就是所谓的...
6. **虚基类**:在多重继承中,如果声明一个基类为虚基类(`class 派生类名: virtual 继承方式 基类名`),那么所有派生自该基类的子类都只包含一个该基类的副本,避免了菱形问题。 7. **综合应用实例**:通常通过...
- 使用多继承时需注意菱形问题,C++ 中通过 virtual 继承解决。 - 适当使用抽象类(包含纯虚函数的类)作为基类,可以提供更好的接口定义和多态性。 以上就是关于类继承的基本概念和关键点,包括其在 C++ 中的...
- 解决二义性问题:通过将共同基类声明为虚基类,如`class 派生类名: virtual 继承方式 基类名`,确保所有派生类都共享同一基类实例。 在实验过程中,学生不仅需要编写代码实现这些要求,还需要通过调试和运行程序...
在虚继承体系中的通过virtual继承而来的基类 继承子类与父类关系 具体化 类的层次通常反映了客观世界中某种真实的模型。在这种情况下,不难看出:基类是对若干个派生类的抽象,而派生类是基类的具体化。基类抽取...
本篇将详细讲解C++中的`virtual`函数、构造函数与析构函数,以及继承与重写的概念。 1. `Virtual`函数 `Virtual`函数是C++中实现动态绑定或运行时多态的主要方式。当基类指针或引用指向派生类对象时,调用具有`...
这是因为C++在编译时会隐式地将virtual继承到子类中。private成员同样被继承,只是子类无法直接访问。对于非静态成员,子类的空间包含所有父类的非静态成员(除了static成员)。这意味着即使子类的函数不声明为...
虚继承的基本语法形式是`class 派生类名 : virtual 继承方式 基类名`。因此,选项B是正确的虚基类声明方式。 以上是对给定C++自考模拟试题中部分选择题的知识点解析,希望对考生们有所帮助。在准备考试的过程中,...
在钻石继承的场景中,如果B和C都虚拟地继承自A,即`class B : virtual public A`和`class C : virtual public A`,那么类D在继承B和C时,只会有一个从A继承来的实例。这样,当D调用虚函数时,由于A在继承链中只出现...
随着技术的发展,Microsoft 后续又推出了 Hyper-V,这是一个更强大、更现代的虚拟化平台,它继承了 Virtual Server 的企业级特性,并在性能和可扩展性方面进行了大幅提升。Hyper-V 成为了 Microsoft 数据中心虚拟化...
C# 中 override、abstract、virtual、interface 的比较 在 C# 编程语言中,override、abstract、virtual、interface 是四个关键字,它们之间存在着紧密的联系,我们经常会遇到 override、abstract、virtual 这三个...
在C++编程语言中,虚继承(Virtual Inheritance)是一项重要的特性,它主要用于解决多重继承时基类成员被多次继承的问题,尤其是当这些基类中包含非静态成员变量时。本文将从语法、语义、模型、性能和应用五个方面...
虚基类是C++编程语言中的一个核心概念,它在多继承环境中扮演着至关重要的角色。在多继承的类层次结构中,如果一个类被多个子类直接或间接继承,而这个类没有声明为虚基类,那么可能会出现“菱形问题”(Diamond ...
最后,我们要了解虚基类(virtual base class)。在多继承的情况下,如果一个派生类同时继承了两个或多个基类,而这些基类又共享了一个共同的基类,那么不使用虚基类会导致"菱形问题",即派生类会有多个同一基类的...
C++继承是面向对象编程(OOP)中的一个核心概念,它允许一个类(子类或派生类)从另一个类(基类或父类)继承特性,从而实现代码的重用和扩展。在Qt框架中,C++的继承机制同样被广泛应用,以构建丰富的用户界面和...
在C++编程语言中,虚拟继承(Virtual Inheritance)是一种特殊的继承方式,它解决了一类称为“菱形问题”或多继承中的二义性问题。在本篇内容中,我们将深入探讨虚拟继承的概念、作用以及如何在实践中应用。通过一个...
`UniversityObject` 类作为整个层次结构的基类,它只包含一个纯虚函数 `virtual char* getSummary();`。这个函数没有具体的实现,但要求所有派生类必须提供自己的版本。这样做的目的是为了确保所有派生类都能够以...