`
蒙面考拉
  • 浏览: 161159 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

虚拟继承分析

 
阅读更多

 

#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个字节

 

 

虚继承又叫共享继承,当两个类虚继承同一个类时,此时又一个类继承这两个虚继承的类时对于基类只有一份拷贝

 

看下图:

 

                       virtualinheritance

                     非虚继承                                                                   虚继承

 

 

                                                                 

 

 

 

 

 

分享到:
评论

相关推荐

    C++虚拟多重继承对象模型讨论-样例

    这种继承方式的主要目的是解决“菱形问题”(Diamond Problem),即在非虚拟继承的多重继承中,派生类可能会有多于一份基类子对象,导致二义性。本篇讨论将深入探讨虚拟多重继承的对象模型,以及如何通过样例程序来...

    关于C++中虚拟继承的一些总结分析

    1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、...

    C++ 多重继承和虚拟继承对象模型、效率分析

    C++的多重继承和虚拟继承是面向对象编程中两种高级特性,它们允许类从多个基类继承特性,但同时也引入了复杂性和效率问题。本文主要探讨了这两种继承方式的基本概念,对象模型的差异,以及它们对运行效率的影响。 ...

    将子类引用赋给父类对象时,java虚拟主机并没有将那些非继承成员丢弃

    至于标签"源码"和"工具",这可能意味着深入理解JVM的内部工作原理,以及使用诸如IDE或调试工具来查看和分析类的元数据和内存布局是有助于进一步掌握这个概念的。例如,通过反编译工具如JAD或使用Java的反射API,我们...

    从汇编看c++的虚拟继承以及其内存布局

    在C++中,虚拟继承(virtual inheritance)是一种解决多重继承中“菱形问题”的机制,它确保了子类中只有一个共享基类实例。这个特性在内存布局和对象构造上都有特殊的影响。我们来深入理解一下这个概念。 首先,让...

    虚拟示波器简介

    虚拟示波器与Multi-Instrument 3.1作为新一代的电子测量工具,不仅继承了传统示波器的基本功能,更通过软件的创新设计,整合了多种高级分析工具,极大地拓展了电子工程师与科研人员的工作能力。无论是教学、研发还是...

    Java语言继承中多态的机理分析.pdf

    最后,关于Java语言继承中多态的机理分析,需要指出的是,这种机理的存在依赖于Java语言规范的严格定义和Java虚拟机(JVM)的高效实现。只有在理解了Java语言的继承和多态机制之后,才能更好地设计出灵活、健壮的...

    C#继承与重写实现工资的预算

    本文将详细解析一个具体的案例:“C#继承与重写实现工资的预算”,通过分析提供的代码片段,我们将深入了解如何利用继承和重写来构建灵活的工资预算系统。 ### 继承的概念 继承是一种机制,允许创建一个新的类...

    C++多继承Demo

    通过分析源代码,我们可以更深入地理解多继承的实现细节和应用场景。 总之,C++的多继承机制提供了灵活的代码重用,但也需要开发者谨慎处理潜在的二义性和菱形问题。通过学习和实践"**C++多继承Demo**",我们可以更...

    C++菱形继承原理分析

    菱形继承在C++继承中是一种复杂的继承关系,存在着二义性和数据冗余的问题,而菱形虚拟继承则是为了解决菱形继承所存在的问题。为了探讨菱形虚拟继承如何解决该问题,我先建立个一个较为简单的菱形继承模型。下面...

    c++ 实现虚拟文件系统

    通过以上分析,可以看出这是一个相对基础但完整的虚拟文件系统实现。它利用了C++中的结构体来组织数据,并通过一系列初始化函数来准备虚拟磁盘。此外,还定义了一些基本的数据结构来处理文件操作,例如文件列表、...

    Citrix桌面虚拟化组策略优化指南.pdf

    (2)策略继承:Citrix桌面虚拟化环境中,策略继承也非常重要。管理员需要了解策略继承的规则,以确保策略正确地应用于虚拟桌面环境。 (3)策略过滤:管理员可以使用策略过滤来限制策略的应用范围,从而提高策略的...

    LabVIEW高级编程与虚拟仪器工程应用 源代码

    虚拟仪器是指用软件定义的仪器,它可以模拟传统硬件仪器的功能,如示波器、频谱分析仪等,同时还能根据需求定制功能。源代码可能涵盖从简单的数据采集到复杂的数据分析和控制系统的实现,涉及领域广泛,如测试测量、...

    虚拟目录及servlet测试.txt

    基于提供的部分内容,我们可以详细分析如何在Tomcat中设置虚拟目录,并进行Servlet的测试: 1. **创建虚拟目录**: - 首先,选择一个本地目录作为虚拟目录的映射目标,例如在D盘下创建一个名为`mysite`的目录。 -...

    C++中的菱形继承深入分析

    C++中的菱形继承深入分析 C++中的菱形继承是一种复杂的继承关系,存在数据冗余和二义性问题。在菱形继承中,一个子类继承了多个父类,每个父类都包含了相同的成员变量,这将导致数据冗余和二义性问题。例如,在上面...

Global site tag (gtag.js) - Google Analytics