1.  类模板的 static 成员[不同于C#中的static]

类模板能够像随意其它类一样声明static 成员。下面代码:

 template <class T> class Foo {
public:
static std::size_t count() { return ctr; }
// other interface members
private:
static std::size_t ctr;
// other implementation members
};

定义了名为Foo 的类模板,它有一个名为count 的public static 成员函数和一个名为ctr 的private static 数据成员。

Foo 类的每一个实例化有自己的static 成员:

 // Each object shares the same Foo<int>::ctr and Foo<int>::count members
Foo<int> fi,fi2, fi3;
// has static members Foo<string>::ctr and Foo<string>::count
Foo<string> fs;

每一个实例化表示截然不同的类型,所以给定实例外全部对象都共享一个static 成员。因此,Foo<int>类型的随意对象共享同一static 成员ctr,Foo<string> 类型的对象共享还有一个不同的 ctr 成员。

使用类模板的static 成员通常,能够通过类类型的对象訪问类模板的static 成员,或者通过使用作用域操作符直接訪问成员。当然,当试图通过类使用static 成员的时候,必须引用实际的实例化:

 Foo<int> fi, fi2;                           // instantiates Foo<int> class
size_t ct =Foo<int>::count(); // instantiates Foo<int>::count
ct = fi.count(); // ok: uses Foo<int>::count
ct = fi2.count(); // ok: uses Foo<int>::count
ct = Foo::count(); // error: which template instantiation?

与随意其它成员函数一样,static成员函数仅仅有在程序中使用时才进行实例化。

2. 句柄类

类管理继承层次中对象的指针,句柄的用户不必管理指向这些对象的指针,用户代码能够使用句柄类来编写。

句柄可以动态分配和释放相关继承类的对象,而且将全部“实际”工作转发给继承层次中的底层类。

3. 转换与多个基类

 class X { ... };
class A { ... };
class B : public A {... };
class C : private B {... };
class D : public X,public C { ... };
// 假设有,以下转换中哪些是不同意的?
D *pd = new D;
(a) X *px = pd;
(c) B *pb = pd; // X, B is private
(b) A *pa = pd; // X, B is private
(d) C *pc = pd;

4. 虚继承

虚继承是一种机制,类通过虚继承指出它希望共享其虚基类的状态。在虚继承下,对给定虚基类,不管该类在派生层次中作为虚基类出现多少次,仅仅继承一个共享的基类子对象。共享的基类子对象称为虚基类。

5. 如何构造虚继承的对象

让我们看看虚继承情况下如何构造对象。

 Bear::Bear(std::string name, bool onExhibit): ZooAnimal(name,onExhibit, "Bear") { }
Raccoon::Raccoon(std::string name, boolonExhibit) : ZooAnimal(name,onExhibit, "Raccoon") { }
// 尽管ZooAnimal 不是Panda 的直接基类,可是Panda 构造函数也初始化 ZooAnimal 基类:
Panda::Panda(std::string name, bool onExhibit) : ZooAnimal(name,onExhibit, "Panda"), Bear(name,onExhibit),Raccoon(name, onExhibit), Endangered(Endangered::critical), sleeping_flag(false){ } Bear winnie("pooh"); // Bear constructor initializes ZooAnimal
Raccoon meeko("meeko"); // Raccoon constructor initializesZooAnimal
Panda yolo("yolo"); // Panda constructor initializes ZooAnimal

当创建Panda 对象的时候,

1. 首先使用构造函数初始化列表中指定的初始化式构造ZooAnimal 部分。

2. 接下来,构造Bear 部分。忽略Bear 的用于ZooAnimal 构造函数初始化列表的初始化式。

3. 然后,构造Raccoon 部分,再次忽略ZooAnimal 初始化式。

4. 最后,构造Panda 部分。

假设Panda 构造函数不显式初始化ZooAnimal 基类,就使用ZooAnimal 默认构造函数;假设ZooAnimal 没有默认构造函数,则代码出错。当编译Panda 构造函数的定义时,编译器将给出一个错误信息。

6. 小结

在抛出异常的时候,会终止当前正在运行的函数并開始查找近期的catch 子句,在查找catch子句的时候,作为异常处理的一部分,将撤销退出函数内部定义的局部变量。这样的撤销对象提供了一个重要的编程技术,称为“资源分配即初始化”(RAII)。命名空间是一种机制,用于管理用独立供应商开发的代码建立的大型复杂应用程序。一个命名空间就是一个作用域,当中能够定义对象、类型、函数、模板和其它命名空间。标准库就定义在名为std 的命名空间中。

通过using 声明,当前作用域中就都能够訪问某个命名空间中的名字了。

当然,也能够通过using 指示将一个命名空间中的全部名字带入当前作用域,但这样的做法非常不安全。

从概念上来看,多重继承非常easy:派生类能够继承多个直接基类,派生类对象由派生部分和每一个基类所贡献的基类部分构成。尽管多重继承概念简单,但细节可能非常复杂,尤其是,继承多个基类引入了新的名字冲突可能性,而且会导致对对象基类中的名字的引用出现二义性。

一个类继承多个直接基类的时候,那些类有可能本身还共享还有一个基类。在这样的情况下,中间类能够选择使用虚继承,声明愿意与层次中虚继承同一基类的其它类共享虚基类。用这样的方法,后代派生类中将仅仅有一个共享虚基类的副本。

C++学习笔记13-类继承的更多相关文章

  1. scala学习手记13 - 类继承

    在scala里,类继承有两点限制: 重写方法需要使用override关键字: 只有主构造函数才能往父类构造函数中传参数. 在java1.5中引入了override注解,但不强制使用.不过在scala中 ...

  2. Python 学习笔记15 类 - 继承

    我们在编程的过程中,并非都是要重头开始.比如其他人已经有现成的类,我们可以使用其他找人编写的类.术语称之为: 继承. 当一个类继承例外一个类时,它可以获得这个类的所有属性和方法:原有的类称之为 父类, ...

  3. Python 学习笔记13 类 - 创建和简单使用

    介绍: 面向对象编程是一种非常有效的软件编写方法之一,在面向对象编程中,我们会编写表示现实世界中的事物或者情景的类,并基于类来创建对象. 在编写类的的时候,这些类对象一般都有通用的行为或者属性.基于类 ...

  4. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  5. springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定

    springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...

  6. 并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理

    · 在并发编程中,我们有时候会需要使用到线程安全的队列,而在Java中如果我们需要实现队列可以有两种方式,一种是阻塞式队列.另一种是非阻塞式的队列,阻塞式队列采用锁来实现,而非阻塞式队列则是采用cas ...

  7. UML学习笔记:类图

    UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...

  8. 学习笔记——python(继承)

    学习笔记(Python继承) 有几种叫法(父类-子类.基类-派生类)先拿代码演示一下: class father: def work(self): print("work>>&g ...

  9. Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法

    Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法 这篇笔记将介绍如何使用Ext.Net GridPanel 中使用Sorter. 默认情况下,Ext.Net GridP ...

  10. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

随机推荐

  1. Java开发环境的基本设置

    作为Java的刚開始学习的人,不知道其它的刚開始学习的人有没有和我一样的感受:用Java开发须要配置这么复杂 的环境.太难了.第一次配置时,一团混乱.Oracle监听服务打不开了,PLSql连接不上O ...

  2. Android_declare-styleable_自己定义控件的属性

    1.简单实例 (1).在res/values文件下定义一个attrs.xml文件 <? xml version="1.0" encoding="utf-8" ...

  3. linux上安装配置vsftpd(转)

    转自:http://www.webarch.org/category/linux生产环境是Centos5.6,由于需要提供ftp服务,就找了一款比较小巧的ftp服务器端软件,vsftpd(vsftpd ...

  4. “ddl”有一个无效 SelectedValue,因为它不在项目列表中。

    “ddl_ekt”有一个无效 SelectedValue,因为它不在项目列表中. 怎么回事 现象: 在用户控件的page_load事件里绑定下拉框,报上面错误 解决: 将下拉框绑定,放在page_In ...

  5. MVC 中使用 SignalR 实现推送功能

    MVC 中使用 SignalR 实现推送功能 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Pus ...

  6. OWIN编写中间件

    OWIN系列之自己动手编写中间件 一.前言 1.基于OWIN的项目摆脱System.Web束缚脱颖而出,轻量级+跨平台,使得ASP.NET应用程序只需依赖这个抽象接口,不用关心所运行的Web服务器. ...

  7. async And await异步编程活用基础

    原文:async And await异步编程活用基础 好久没写博客了,时隔5个月,奉上一篇精心准备的文章,希望大家能有所收获,对async 和 await 的理解有更深一层的理解. async 和 a ...

  8. yum简介(转)

    yum是什么yum = Yellow dog Updater, Modified 主要功能是更方便的添加/删除/更新RPM包. 它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题yum特点可 ...

  9. 在Windows基础上(硬盘)安装Linux操作系统(CentOS/RedHat)

    注:该方法安装CentOS ,RedHat均没有问题,其它Linux操作系统,没有尝试过. 0.创建一个fat32的盘.我分了8G给这个盘,盘符为F.F盘以后的内存所有删除,作为未分配的内存.这个留用 ...

  10. 谈谈CListCtrl 扩展风格设置方法-SetExtendedStyle和ModifyStyleEx 比較

    谈谈CListCtrl 扩展风格设置方法 --------------------------------------SetExtendedStyle和ModifyStyleEx 比較 对于刚開始学习 ...