C++中虚拟继承】的更多相关文章

多重继承 在多重继承中,基类的构造函数的调用次序即不受派生类构造函数初始化列表中出现的基类构造函数的影响,也不受基类在构造函数初始化列表中的出现次序的影响,它按照基类在类派生列表中的出现次序依次调用相应的基类构造函数.析构函数与构造顺序逆序进行. 多重继承中,派生类的指针或引用可以转换为其任意基类的指针或者引用.因此,这种转换更可能遇到二义性的问题. 在多重继承中,成员函数中使用的名字查找首先在函数本身进行,如果不能在本地找到名字,就继续在成员的类中查找,然后同时(并行)查找所有基类继承子树.多…
C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射.这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题.class 派生类名:virtual 继承方式 基类名virtual是关键字,声明该基类为派生类的虚基类.在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用.声明了虚基类之后,虚基类…
1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念.虚拟基类是为解决多重继承而出现的.如:类D继承自类B1.B2,而类B1.B2都继承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存空间,可以将B1.B2对A的继承定义为虚拟继承,而A就成了虚拟基类.实现的代码如下: class A class B1:public virtual A; class B2:public virtual A; class D:public B1,public B2; 虚拟继承在一般的应用中很少用到,…
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化    译 译者前言 一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细节.对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释. Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些.因此,从篇幅和内容来看,译者认为本文…
一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent{ public: void fun(){ cout<<"Parent fun"<<endl; } }; class Child : public Parent{ public: void fun(){ cout<<"Child fun&quo…
1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念.虚拟基类是为解决多重继承而出现的.如:类D继承自类B1.B2,而类B1.B2都继 承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存空间,可以将B1.B2对A的继承定义为虚拟继承,而A就成了虚拟基类.实现的代码如 下: class A class B1:public virtual A; class B2:public virtual A; class D:public B1,public B2; 虚拟继承在一般的应用中很少用…
本文笔者在青岛逛街的时候突然想到的...最近就有想写几篇关于继承虚函数的笔记,所以回家到之后就奋笔疾书的写出来发布了 应用sizeof函数求类巨细这个问题在很多面试,口试题中很轻易考,而涉及到类的时候,又不得不说类的继承,虚继承,虚函数,所以涉及到了类的内存布局,其中关于虚拟继承(virtual public)这个话题比拟难以懂得,而且不同的编译器环境可能实现的类的内存布局不同,所以本文仅在ms vs2010编译环境下调试,如果你在像cfree这样的编译器中调试结果会不同当涉及到虚拟继承的时候.…
昨天笔试遇到个 关于类占用的空间大小的问题,以前没怎么重视,回来做个试验,还真发现了问题,以后各位笔试考官门,出题时请注明是用什么编译器. vc6/vc8 cl 和 Dev-C 的g++ 来做的测试: 上代码, 测试代码: #include <stdio.h>class A{public: int x;  int y; A() {  x = 1;     y = 2; }; void go() {  printf("A go()\n"); }    virtual void…
  虚拟基类是为解决多重继承而出现的.   以下面的一个例子为例: #include <iostream.h> #include <memory.h> class CA { int k; //如果基类没有数据成员,则在这里多重继承编译不会出现二义性 public: void f() {cout << "CA::f" << endl;} }; class CB : public CA { }; class CC : public CA {…
本文只是粗浅讨论一下C++中的多重继承和虚拟继承. 多重继承中的构造函数和析构函数调用次序 我们先来看一下简单的例子: #include <iostream> using namespace std; class A { private: char idA; public: A(){ idA = 'A'; cout << "Constructor of A is called!" << endl; } ~A() { cout << &qu…
文章导读:C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承. 在过去的学习中,我们始终接触的单个类的继承,但是在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承. 举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性. 由此我们不难想出如下的图例与代码: 当一个派生类要使用多重继承的时候,必须在…
继承是C++作为OOD程序设计语言的三大特征(封装,继承,多态)之一,单一非多态继承是比较好理解的,本文主要讲解GCC环境下的多重继承和虚拟继承的对象内存布局. 一.多重继承 先看几个类的定义: 01 class Top 02  { 03 public: 04       int a; 05  }; 06   07  class Left : public Top 08  { 09 public: 10       int b; 11  }; 12   13  class Right : pub…
今天专门看了一下虚继承的东西,以前都没怎么用过,具体如下:父类: 复制代码代码如下: class   CParent { .... }; 继承类的声明比较特别: class   CChild   :   virtual   public   CParent { .... }   请问,这个"virtual"是什么作用及含义? --------------------------------------------------------------- 表示虚拟继承,和普通继承是C++的…
继承机制是面向对象程序设计使代码能够复用的最重要的手段,它同意程序猿在保持原有类特性的基础上进行扩展,添加功能. 这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. #include<iostream> using namespace std; class Base { public: Base() {} ~Base() {} private: int _pri; protected: int _pro; public: int _pub; };…
2622: B 虚拟继承(虚基类)-沙发床(改错题) 时间限制: 1 Sec  内存限制: 128 MB 提交: 487  解决: 393 题目描述 有一种特殊的床,既能当床(Bed)用又能当沙发(Sofa)用,所以叫沙发床(SleeperSofa). 同时床和沙发又是一种特殊的家具(Furniture),具有一切家具的特性. 利用虚拟继承(虚基类)建立一个类的多重继承,沙发床继承了床和沙发的特性. 下面的程序中,在begin到end部分存在语法错误.请改正错误,使程序按下面输入输出的规定运行.…
虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段.而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个间接的指针去存取基类对象中的字段. 虚函数的实现原理 当编译器对程序进行编译碰到虚函数时,将不会赋予一个地址,而是插入一段汇编代码.每个包含虚函数的类都会由编译器产生一个虚函数表和一个虚函数表指针,其中虚函数表指针放在每个类的首地址处.当程序执行时,碰到对虚函数的调用,则通过插入的汇编代码到当前类的…
我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对于继承的知识点,你真的都了解了吗? 首先,我们都知道子类继承父类,就能直接访问父类的公共属性以及受保护属性(public和protected),同时也能直接访问父类的公共方法以及受保护方法:其次,对于父类的私有属性,子类并不能直接访问,但是可以通过父类提供的getter和setter方法进行访问,而…
    图文例解C++类的多重继承与虚拟继承 在过去的学习中,我们始终接触的单个类的继承,但是在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承. 举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性. 由此我们不难想出如下的图例与代码: //站点:www.cndev-lab.com    //所有稿件均有版权…
[TOC] 关于Java中的继承和组合的一个错误使用的例子 相信绝大多数人都比较熟悉Java中的「继承」和「组合」这两个东西,本篇文章就主要就这两个话题谈论一下.如果我某些地方写的不对,或者比较幼稚,论证不清晰,欢迎大家留言指正. 什么是「组合」和「继承」 假设有2个class:A和B: 如果class A extends B 那么我们就说A继承B,A是子类,B是父类,这种情况就是继承. 如果A中有一个属性的类型为B,那么我们就说这种情况就是组合. 分别在什么情况下使用 回想一些我们一般会在什么…
面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多继承,为什么OC不支持多继承稍后将会提到.  说到继承呢,想到了一本书上是引用<大话西游>里的一句话来描述继承的.“人是人他妈生的,妖是妖他妈生的!”,想必里面的唐三藏也学过OOP编程,也许他们师徒四人去西天取什么算法导论呢,漫谈OOP编程啦,数据结构啦等这类的书去啦.人和妖都属于动物类,但各自有…
vbox中虚拟ubuntu增加新的虚拟硬盘   在virtualbox中装好Ubuntu后,发现硬盘空间不够使用 了.以下是搜集整理的解决办法:   1. 添加新硬盘        设置 -> Storage -> SATA控制器->右击,选择“添加虚拟硬盘”      然后,根据需求创建合适的硬盘 2. 重启虚拟机      查看现有系统的磁盘空间         sudo fdisk -l      可看到新加的虚拟硬盘,一般名为:Disk /dev/sdb 3. 给新加的硬盘分区…
一.使用注解的DI实现 1.@Resource 使用该注解能够实现引用型属性的DI实现,该注解能够根据属性名和属性类型自动给属性赋值.一般使用@Resource(name="student")的形式明确指定名称,这样就只能根据属性名来填充值了. 步骤: (1)导入命名空间:命名空间示例 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spr…
为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:(java中是可以的) 2.编译器从上往下执行,所以在子类前面至少应该要有父类的声明:如 @interface Worker : Person   @end 3.OC中的子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部寻找,如果父类没有定义该方法,则继续在继承链上查找,直到找到为止,如…
Javascript中的继承一直是个比较麻烦的问题,prototype.constructor.__proto__在构造函数,实例和原型之间有的 复杂的关系,不仔细捋下很难记得牢固.ES6中又新增了class和extends,和ES5搅在一起,加上平时很少自己写继承,简直乱成一锅粥.不过还 好,画个图一下就清晰了,下面不说话了,直接上图,上代码. ES5 ES5中的继承,看图: function Super() {} function Sub() {} Sub.prototype = new S…
首先声明,一些内容基于个人猜测,如果哪里有错误,请立即联系在下! 我们用js操作Dom时,会经常用到一些个方法比如基于获取到的元素选择其子元素: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>title</title> <style type="text/css"> #box{ height: 100px; b…
按照我个人的理解,继承和实现接口不是一个概念,结构和类型都可以实现接口,枚举不能. 话说,结构可以继承吗? 先梳理一下C#中的继承关系,如下图: class => [BaseClass =>] System.Object struct => System.ValueType => System.Object enum => System.Enum => System.ValueType => System.Object C#中的所有类型,结构和枚举都是直接或间接继…
JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式:对象冒充 function Parent(username) //父类对象 { this.username = username; //下面的代码最关键的部分就是将子对象的this传递给了父对象 this.sayHello = function() { alert(this.username); } } f…
引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原型链作为JS实现继承的主要方式,其基本思想是:利用原型让一个引用类型继承另一个引用类型的属性和方法.我们可以简单回顾下构造函数.原型对象和实例对象之间的关系.每一个构造函数都有一个指向原型对象的指针,当然原型对象的构造器属性也指向构造函数对象,而实例对象内部有prototype属性指向原型对象.如果…
//Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动..."); } public void breath() { beat(); System.out.println("吸一口气,吐一口气,呼吸中..."); } } //继承Animal,直接复用父类的breath()方法 class Bird extends Animal { pub…
一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.property = true; } SupType.prototype.getSupvalue = function() { return this.property; }; function SubType() { this.subproperty = false; } //原型对象等于一个类型的实例…