C++学习之虚继承】的更多相关文章

http://blog.csdn.net/wangxingbao4227/article/details/6772579 C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类. 这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射.这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题. class 派生类名:virtual 继承方式  基类名virtual是关键字,声明该基类…
说明:在C++学习的过程中,虚继承-虚函数经常是初学者容易产生误解的两个概念,它们与C++中多态形成的关系,也是很多初学者经常产生困惑的地方,这篇文章将依次分别对三者进行解析,并讲述其之间的联系与不同. 一.虚继承 1.在多继承中,对于多个父类的数据及函数成员,虽然有时候把他们全部继承下来是有必要的,比如当这些成员都不同的时候.但在大多数的情况下,比如当多个父类之中的成员有重叠的地方时,因为保留多份数据成员的拷贝,不仅占有了较多的存储空间,还增加了访问的难度(由于继承了来自多个父类的同名数据成员…
用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下,多重继承能够更直接地为应用程序建模.多重继承是从多于一个直接基类派生类的能力,多重继承的派生类继承其全部父类的属性. 一.多重继承 1.定义多个类 为了支持多重继承,扩充派生列表: class Bear : public ZooAnimal { //... }; 以支持由逗号分隔的基类列表: cla…
这篇文章不知道取啥名字了,暂且这样叫,直接看场景就明白了.节选自<深度探索C++对象模型> Point3d origin, *pt = &origin; (1)origin.x = 0; (2)pt->x = 0 上述两种代码执行结果是一样的,但是在执行效率上是否存在差异? (1)如果Point3d是一个普通结构体,普通类,普通单一继承或多继承,则成员x的执行效率都完全相同,因为x在类中的位置偏移,在编译时期就固定了(没有引入虚函数).(2)如果Point3d是虚继承自一个基类,…
虚函数的定义要遵循以下重要规则: 1.如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行晚绑定的. 2.只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数. 3.静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象. 4.内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置.即使虚函数在类的内部定义定义,但是在编译的时候系统仍…
测试代码 #include <stdio.h> struct AA { char b; char b1; int b3; char b2; }; class A { public: A() { b = 'a'; } A(char c){ b = c; printf("build A:%c\n",c); } char b; char a; char c; }; class B :virtual public A { public: B():A('B'){ printf(&qu…
一.多重继承 我们知道,在单继承中,派生类的对象中包含了基类部分 和 派生类自定义部分.同样的,在多重继承(multiple inheritance)关系中,派生类的对象包含了每个基类的子对象和自定义成员的子对象.下面是一个多重继承关系: class A{ /* */ }; class B{ /* */ }; class C : public A { /* */ }; class D : public B, public C { /* */ }; C继承了A,派生类D又继承了B和C,如图所示,一…
仅供互相学习,请勿喷,有观点欢迎指出~ class A { virtual void aa(){}; }; class B : public virtual A { ]; //加入一个变量是为了看清楚class中的vfptr放在什么位置 public: virtual void bb(){}; }; class C : public virtual A { ]; public: virtual void cc(){}; }; class C1 : public A { ]; public: vi…
C++2.0以后全面支持虚函数与虚继承,这两个特性的引入为C++增强了不少功能,也引入了不少烦恼.虚函数与虚继承有哪些特性,今天就不记录了,如果能搞了解一下编译器是如何实现虚函数和虚继承,它们在类的内存空间中又是如何布局的,却可以对C++的了解深入不少.这段时间花了一些时间了解这些玩意,搞得偶都,不过总算有些收获,嘿嘿. 先看一段代码class A{      virtual aa(){};}; class B : public virtual  A{      char j[3];      …
title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categories: [学习,程序员,c++] 一 继承方式 public protected private 二 多继承和多重继承 举个例子就明白了 多继承 :农民工就算是多继承. graph TD; 人类-->农民; 人类-->工人; 农民-->农民工; 工人-->农民工; 多重继承 :小学生…