#include <iostream.h>
#include <memory.h>
class CA
{
int k;
public:
void f() {cout << "CA::f" << endl;}
};
class CB : virtual public CA //也有一种写法是class CB : public virtual CA
{ //实际上这两种方法都可以
};
class CC : virtual public CA
{
};
class CD : public CB, public CC
{
};
void main()
{
cout<<sizeof(CD)<<endl;
}
输出是:12 int k;占四个字节。CB里面的vbptr和CC里面的vbptr指针各占4个字节。
#include <iostream.h>
#include <memory.h>
class CA
{
int k;
public:
void f() {cout << "CA::f" << endl;}
};
class CB : public CA //也有一种写法是class CB : public virtual CA
{ //实际上这两种方法都可以
};
class CC : public CA
{
};
class CD : public CB, public CC
{
};
void main()
{
cout<<sizeof(CD)<<endl;
}
输出是:8 CB里面的 int k和CC里面的 int k,各占4个字节。
#include <iostream.h>
#include <memory.h>
class CA
{
int k;
public:
virtual void f() {cout << "CA::f" << endl;}
};
class CB : public CA //也有一种写法是class CB : public virtual CA
{ //实际上这两种方法都可以
};
class CC : public CA
{
};
class CD : public CB, public CC
{
};
void main()
{
cout<<sizeof(CD)<<endl;
}
输出是:16 CB里面int k和vbtr指针以及CC里面的intk和vbtr指针。
#include <iostream.h> #include <memory.h> class CA { int k; public: virtual void f() {cout << "CA::f" << endl;} }; class CB :virtual public CA //也有一种写法是class CB : public virtual CA { //实际上这两种方法都可以 }; class CC : public CA { }; class CD : public CB, public CC { }; void main() { cout<<sizeof(CD)<<endl; } 输出是:20 CB里面的int k,vbptr(虚继承)指针和vbtr指针以及CC里面的int k和vbtr指针。 #include <iostream.h> #include <memory.h> class CA { int k; public: virtual void f() {cout << "CA::f" << endl;} }; class CB :virtual public CA //也有一种写法是class CB : public virtual CA { //实际上这两种方法都可以 }; class CC :virtual public CA { }; class CD : public CB, public CC { }; void main() { cout<<sizeof(CD)<<endl; } 输出是:16 CA里面的int k ,vbtr指针 8个字节。CB里面的vbptr指针4个字节,CC里面的vbptr指针4个字节
虚继承又叫共享继承,当两个类虚继承同一个类时,此时又一个类继承这两个虚继承的类时对于基类只有一份拷贝
看下图:
非虚继承 虚继承
发表评论
-
析构函数为虚函数的原因
2012-09-09 11:42 840我们知道,用C++开发的时候,用来做基类的类的析构函数 ... -
hash的应用
2012-08-31 23:02 966第一部分为一道百度面试题Top K算法的详解;第二部分为关 ... -
微软智力题
2012-08-29 19:59 575第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有 ... -
C++不能被继承的类
2012-08-27 20:16 1065一个类不能被继承, ... -
括号对齐问题
2012-08-27 10:47 1417解法一:左右括号成一对则抵消 可以 ... -
树的遍历
2012-08-19 10:43 723/****************************** ... -
堆排序
2012-08-16 14:24 888堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全 ... -
多态赋值
2012-08-14 16:16 836#include <iostream> usi ... -
static变量与static函数(转)
2012-08-13 10:15 750一、 static 变量 static变量大致分为三种用法 ... -
不用sizeof判断16位32位
2012-08-10 15:21 1709用C++写个程序,如何判断一个操作系统是16位还是3 ... -
找出连续最长的数字串(百度面试)
2012-08-09 15:15 1154int maxContinuNum(const char*in ... -
顺序栈和链栈
2012-08-06 10:01 804顺序栈:话不多说直接上代码 #include ... -
队列的数组实现和链表实现
2012-08-05 16:20 1030话不多少,数组实现上代码: #include<i ... -
KMP算法详解
2012-08-02 21:40 892KMP算法: 是在一个“主文本字符串” ... -
字符串的最长连续重复子串
2012-08-01 15:05 9785两种方法: 循环两次寻找最长的子串: <方法一> ... -
寻找一个字符串连续出现最多的子串的方法(转)
2012-07-31 21:19 1001算法描述首先获得后缀数组,然后1.第一行第一个字符a,与第二行 ... -
字符串的循环移位
2012-07-31 16:52 982假设字符串:abcdefg 左循环两位:cdefgab 右 ... -
一次谷歌面试趣事(转)
2012-07-31 15:26 775很多年前我进入硅谷 ... -
约瑟夫环问题(循环链表)
2012-07-30 21:31 1297题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1, ... -
面试之单链表
2012-07-30 20:18 7311、编程实现一个单链表的建立/测长/打印。 ...
相关推荐
这种继承方式的主要目的是解决“菱形问题”(Diamond Problem),即在非虚拟继承的多重继承中,派生类可能会有多于一份基类子对象,导致二义性。本篇讨论将深入探讨虚拟多重继承的对象模型,以及如何通过样例程序来...
1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、...
C++的多重继承和虚拟继承是面向对象编程中两种高级特性,它们允许类从多个基类继承特性,但同时也引入了复杂性和效率问题。本文主要探讨了这两种继承方式的基本概念,对象模型的差异,以及它们对运行效率的影响。 ...
至于标签"源码"和"工具",这可能意味着深入理解JVM的内部工作原理,以及使用诸如IDE或调试工具来查看和分析类的元数据和内存布局是有助于进一步掌握这个概念的。例如,通过反编译工具如JAD或使用Java的反射API,我们...
在C++中,虚拟继承(virtual inheritance)是一种解决多重继承中“菱形问题”的机制,它确保了子类中只有一个共享基类实例。这个特性在内存布局和对象构造上都有特殊的影响。我们来深入理解一下这个概念。 首先,让...
虚拟示波器与Multi-Instrument 3.1作为新一代的电子测量工具,不仅继承了传统示波器的基本功能,更通过软件的创新设计,整合了多种高级分析工具,极大地拓展了电子工程师与科研人员的工作能力。无论是教学、研发还是...
最后,关于Java语言继承中多态的机理分析,需要指出的是,这种机理的存在依赖于Java语言规范的严格定义和Java虚拟机(JVM)的高效实现。只有在理解了Java语言的继承和多态机制之后,才能更好地设计出灵活、健壮的...
本文将详细解析一个具体的案例:“C#继承与重写实现工资的预算”,通过分析提供的代码片段,我们将深入了解如何利用继承和重写来构建灵活的工资预算系统。 ### 继承的概念 继承是一种机制,允许创建一个新的类...
通过分析源代码,我们可以更深入地理解多继承的实现细节和应用场景。 总之,C++的多继承机制提供了灵活的代码重用,但也需要开发者谨慎处理潜在的二义性和菱形问题。通过学习和实践"**C++多继承Demo**",我们可以更...
菱形继承在C++继承中是一种复杂的继承关系,存在着二义性和数据冗余的问题,而菱形虚拟继承则是为了解决菱形继承所存在的问题。为了探讨菱形虚拟继承如何解决该问题,我先建立个一个较为简单的菱形继承模型。下面...
通过以上分析,可以看出这是一个相对基础但完整的虚拟文件系统实现。它利用了C++中的结构体来组织数据,并通过一系列初始化函数来准备虚拟磁盘。此外,还定义了一些基本的数据结构来处理文件操作,例如文件列表、...
(2)策略继承:Citrix桌面虚拟化环境中,策略继承也非常重要。管理员需要了解策略继承的规则,以确保策略正确地应用于虚拟桌面环境。 (3)策略过滤:管理员可以使用策略过滤来限制策略的应用范围,从而提高策略的...
虚拟仪器是指用软件定义的仪器,它可以模拟传统硬件仪器的功能,如示波器、频谱分析仪等,同时还能根据需求定制功能。源代码可能涵盖从简单的数据采集到复杂的数据分析和控制系统的实现,涉及领域广泛,如测试测量、...
基于提供的部分内容,我们可以详细分析如何在Tomcat中设置虚拟目录,并进行Servlet的测试: 1. **创建虚拟目录**: - 首先,选择一个本地目录作为虚拟目录的映射目标,例如在D盘下创建一个名为`mysite`的目录。 -...
C++中的菱形继承深入分析 C++中的菱形继承是一种复杂的继承关系,存在数据冗余和二义性问题。在菱形继承中,一个子类继承了多个父类,每个父类都包含了相同的成员变量,这将导致数据冗余和二义性问题。例如,在上面...