C++中 引入虚基类的作用】的更多相关文章

当某类的部分或全部直接基类是从另一个基类共同派生而来时,这直接基类中,从上一级基类继承来的成员就拥有相同的名称,派生类的对象的这些同名成员在内存中同时拥有多个拷贝,同一个函数名有多个映射.可以使用作用域分辨符来唯一标识并分别访问它们.也可以将共同基类设置为虚基类,这时从不同的路径继承过来的同名数据成员在内存中只拥有一个拷贝,同一个函数名也只有一个映射.也就是说虚基类解决了同名成员的唯一标识问题.…
虚基类的作用     当一个基类被声明为虚基类后,即使它成为了多继承链路上的公共基类,最后的派生类中也只有它的一个备份.例如:class CBase { }:class CDerive1:virtual public CBase{ }:class CDerive2:virtual public CBase{ }:class CDerive12:public CDerive1,CDerive2{ }:则在类CDerive12的对象中,仅有类CBase的一个对象数据 虚基类的特点: 虚基类构造函数的…
c++中,当继承结构中含有虚基类时,在构造对象时编译器会通过将一个标志位置1(表示调用虚基类构造函数),或者置0(表示不调用虚基类构造函数)来防止重复构造虚基类子对象.如下图菱形结构所示: 当构造类Bottom对象时,Bottom构造函数里面的c++伪码如下(单考虑标志位,不考虑其他): //Bottom构造函数伪码 flag = ;//标志位 if (flag) { 调用虚基类Top的构造函数 } flag = ;//标志位清零 调用Left的构造函数 flag = ;//标志位清零 调用Ri…
原创文章,转载请注明作者与本文原始URL. 问题描述:最近遇到这样一个问题,在调用C++的一个成员函数时,总是进错函数.在调用 pMsg->GetMsgContent() 的时候,总是进入到 pMsg->CreateMsgID() 里面去,调试半天,没发现异样,但是单步跟进去时,也总是进错函数.原因:百思不得其解,最后发现原因是,动态库导出虚接口时的头文件 IMsgFactoy.h 和可执行程序链接时用的头文件不一样,所以才进错了函数.由果推因,之所以进错函数,是因为头文件不一样.总结:1.调…
1 多继承中,必须给每个基类指定一种派生类型,如果缺省,相应的基类则取私有派生类型,而不是和前一个基类取相同的派生类型 2 一个类的保护成员只能被本类的成员函数或者它的派生类成员函数访问 3 由于c++中不允许对类成员进行初始化,但是在编程时需要用特定的值去初始化派生类的对象,这时需要通过为派生类定义一个带有初始化列表的构造函数来实现. class D:public B,private A,public C { public: D(){..................} D(int a,in…
很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生…
白杨 http://baiy.cn “在正确的场合使用恰当的特性” 对称职的C++程序员来说是一个基本标准.想要做到这点,首先要了解语言中每个特性的实现方式及其开销.本文主要讨论相对于传统 C 而言,对效率有影响的几个C++新特性: 编译时开销 运行时开销 相关文档: C++编码规范与指导 C++异常机制的实现方式和开销分析 多处理器环境和线程同步的高级话题 C++0x(C++11)新特性点评 相对于传统的 C 语言,C++ 引入的额外开销体现在以下两个方面: 编译时开销 模板.类层次结构.强类…
转载来自:CSDN insistGoGo  (http://blog.csdn.net/insistgogo) 多继承的定义:派生类的基类大于一个 语法: class  派生类名:继承方式1 基类名1,继承方式2 基类名2... { <派生类新定义成员> }; 多重继承与构造函数的关系: 多重继承时构造函数的作用: 1)初始化派生类(自己) 2)调用该派生类所有基类构造函数,并且为所有基类传参(参数个数必须包含所有基类所需参数) 构造函数语法: 派生类构造函数名(总参数表列): 基类1构造函数…
4.4.3 虚基类1.没什么要引入虚基类 如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个间接的共同基类数据成员的多分同名成员.在访问这些同名的成员时,必须在派生类对象后增加直接基类名,使其惟一地标识一个成员,以免产生二义性. //例 4.15 虚基类的引例 #include<iostream> using namespace std; class Base{ //声明类Base1和类Base2的共同的基类Base public: Base() { a…
下面博客转载自别人的,我也是被这个问题坑了快两天了,关于各种虚基类,虚继承,虚函数以及数据成员等引发的一系列内存对齐的问题再次详细描述 先看下面这片代码.在这里我使用了一个空类K,不要被这个东西所迷惑,我使用这个空类的目的主要是为了让它产生虚基类表指针而又不引入虚基类成员变量,这样我就可以少叙述一些关于虚基类成员排放的东西,而将焦点聚集在引入的那个虚基类表指针之上.这个空类虽然有点特殊,但是在这里它其他的东西和正常的类一样,不要纠结这个.还有,代码我直接指定了对齐参数,是为了不引起混乱. #in…