sizeof与类,继承,virtual的种种】的更多相关文章

类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小.首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址 用sizeof对类名操作,得到的结果是该类的对象在存储器中所占据的字节大小,由于静态成员变量不在对象中存储,因此这个结果等于各非静态数据成员(不包括成员函数)的总和加上编译器额外增加的字节.后者依赖于不同的编译器实现,C++标准对此不做任何保证. 确定类大小的几个原则: 为类的非静态成员数…
存在父子类继承关系时,若有同名成员函数同时存在,会发生隐藏.覆盖和重载这几种情况.对于初学者也比较容易混淆,为此,我整理了一下我的个人看法,仅供参考.希望对大家理解有帮助,也欢迎指正. 1.父子类继承关系: 子类复制父类全部成员 首先,理解父子类的继承关系是怎样发生的.在此基础上就很容易理解它们之间的关系和区别. 每一个类有它自己的成员变量和成员函数,是一个独立的空间整体.当子类继承父类时,会将父类的全部成员全部复制一份,作为子类的成员,但是,同时也会标记这些成员是从父类中继承的,与子类本身的成…
1.前言 本篇文章的全部代码样例.假设是windows上编译执行.则使用的是visual studio 2013.假设是RHEL6.5平台(linux kernal: 2.6.32-431.el6.i686)上编译执行,则其gcc版本号为4.4.7,例如以下所看到的: [root@MiWiFi-R1CM ~]# gcc --version gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4) 2.菱形继承类的内存分布 本篇文章主要讨论的是虚继承(virtual)下…
C++多重继承下,对象布局与编译器,是否为虚拟继承都有很大关系,下面将逐一分析其中的差别,相同点为都按照类继承的先后顺序布局(类内按照虚表.成员声明先后顺序排列).该类情况为子类按照继承顺序排列,如class C:public B,public A此种情况布局如下: 如果class B,A带有虚函数,情况又发生了变化: 考虑下面的情况: class D { int d; public: virtual void fun() {} virtual ~D() {} }; class E { publ…
类库:类库由类声明和实现构成.类组合了数据表示和类方法,因此提供了比函数库更加完整的程序包. 类继承:从已有的类派生出新的类,派生类继承了原有类(称为基类)的特征,包括方法. 通过类继承可以完成的工作: *可以在已有类的基础上添加功能: *可以给类添加数据: *可以修改类的行为. 继承机制只需要提供新特性,甚至不需要访问源代码就可以派生出类. 一.一个简单的基类 首先我们定义一个简单的基类Person,其设计如下: Person.h #include <iostream> #include &…
类继承 在C++类继承中,一个派生类可以从一个基类派生,也可以从多个基类派生. 从一个基类派生的继承称为单继承:从多个基类派生的继承称为多继承. //单继承的定义 class B:public A { < 派生类新定义成员> }; //多继承的定义 class C:public A,private B { < 派生类新定义成员> }; 我们这篇主要说单继承. 派生类共有三种C++类继承方式: 公有继承(public) 基类的公有成员和保护成员可以作为其派生类的公有成员和保护成员 派…
1.考虑下面的需要,需要一个工厂方法.工厂方法的规则是:在堆上分配一个子类对象,并返回父类指针.使用完毕,delete父类指针.如果父类的析构方法不是virtual,将直接调用父类的析构方法,导致局部销毁的对象,父类成分销毁了,子类成分没有销毁. 2.如果类中有virtual方法,意味着面向抽象编程,也就是会有父类指针指向子类对象,因此这种情况下,必定需要一个virtual析构方法. 3.如果类中没有virtual方法,为了节省空间,析构方法是non-virtual方法.也就意味着,这个类不作为…
用sizeof求类的大小,http://blog.csdn.net/szchtx/article/details/10254007(sizeof浅析(三)——求类的大小),这篇博文给出了非常详尽的举例介绍. 但是细心的话,你会发现一个小瑕疵,那就是对如下例子求sizeof(B),在VS下是16不是12! class A { public: int a; private: char b; }; class B : public A { public: int d; char c; }; 以下是我根…
一.前言 在上一篇C++基础博文中讨论了C++最基本的代码重用特性——类继承,派生类可以在继承基类元素的同时,添加新的成员和方法.但是没有考虑一种情况:派生类继承下来的方法的实现细节并不一定适合派生类的需求,此时派生类需要重载集成方法. 二.重载方法及虚函数     我们讨论<C++ Primer Plus>中的如下场景:银行记录客户信息,包括客户姓名.当前余额.客户这一类别当然能够创建客户对象.存款.取款以及显示信息.银行需要特殊记录具有透支权限的客户,因此这一类别的客户要额外记录透支上限.…
1,派生类继承了基类的所有成员函数和数据成员(构造函数.析构函数和操作符重载函数外). 2,当不指明继承方式时,默认为私有继承. 3,基类的私有成员仅在基类中可见,在派生类中是不可见的.基类的私有成员可以由派生类继承,但在派生类中不可见.尽管在派生类中不能直接访问基类的私有成员,但可以通过间接的方式进行访问(设置公有成员访问函数). 4,改变访问限制:通过使用 using 声明可以改变成员在派生类中的访问限制. class BC { public: void set_x(float a) { x…