C++学习日记day06

原创 2012年03月22日 21:09:50

第六课
1.动态绑定的底层实现——虚函数表
class A {...};
class B : public A {};
A* pa = new B;
当编译器编译如下语句时
pa -> foo ();
它并不知道pa所指向对象的真实身份,编译器所能做的就是用一段代码替换上面的函数调用语句,这段代码将依次执行下列操作:
1) 首先弄清指针pa所指向对象的真实身份;
2) 然后通过这个对象的虚函数表指针_vftbl访问其虚函数表,并找到与foo()标识符相对应的虚函数入口地址;
3) 根据虚函数的入口地址,调用该函数。
实现多态的必要条件:
1) 虚函数;
2) 通过指针或者引用调用。
class A {
public:
    void foo (void) {
        bar (); // this -> bar (),this是一个指向B对象的A*
    }
    virtual void bar (void) {
    }
};
class B : public A {
public:
    void bar (void) {}
};
int main (void) {
   B b;
   b.foo ();
}
构造函数、析构函数、运算符函数、静态成员函数,哪些不可以是虚函数?为什么?
构造函数和静态成员函数不能被定义为虚函数。
2.类型信息和类型转换
1)类型信息
int n;
typeid (int)
typeid (n)
返回typeinfo对象,在该对象上调用name()成员函数,获取类型名。
typeinfo对象支持==判断。
只有在具有多态关系的父子类之间,才能通过typeid正确地判断一个指针实际指向的对象类型。
2)类型转换
dynamic_cast:一般用在具有多态继承关系的父子类之间。
static_cast:一般用在需要检查类型相关性的场合。
reinterpret_cast:一般用在自己对所要做的事情十分清楚的场合。
练习:实现一个动物园,动物园里面关着三种动物,小鸟、小鱼和狮子,所有的动物都有编号,每种动物又有自己的特定,小鸟有最高飞行高度,小鱼有最远游行距离,狮子有最快奔跑速度。每种动物类提供如下接口:
Like()返回该动物喜欢吃什么。
Eat()进食。每种动物在进食之前,要自我介绍一下。
动物园提供接口:
Raise()加入一种动物。
Feed()喂养所有的动物。
动物园解体的时候所有的动物获得自由,高呼“自由万岁”,每种表达一下自己愉快的心情。
    Animal:编号,
   /   |  \
Bird Fish  Lion
Zoo 最多养10只动物。
3.异常
异常捕获:
try {
    可能引发异常的语句;
}
catch (异常类型1 ex) {
    异常处理语句;
}
catch (异常类型2 ex) {
    异常处理语句;
}
...
catch (...) {
    异常处理语句;
}
异常抛出:
throw 异常对象;
异常的基本用法:
1.抛出简单类型变量,用异常变量的值区分不同的异常
2.抛出类类型异常对象,通过异常类型区分不同的异常
3.从标准异常继承
4.继续抛出异常
5.异常说明
返回类型 函数名 (形参表) throw (异常类型1, 异常类型2, ...) {...}
构造函数中的异常:构造函数可以抛出异常,而且在某些情况下必须抛出异常。如果构造函数抛出异常,所构造的对象将被不完整构造,而一个不完整构造的对象的析构函数是不会被调用的。如果在抛出异常之前动态分配的对象,应该在throw之前将其释放。或者通过智能指针保证所有动态分配的对象都能在抛出异常之后被自动析构。
析构函数中的异常:最好不要在析构函数中抛出异常,这样做会导致进程进入不稳定状态。尽可能地捕获析构函数中的函数调用所引发的异常。
A::~A (void) {
    try {
        全部代码;
    }
    catch (...) {
    }
}
4.I/O流
1) 文本文件I/O
A. 格式化I/O
B. 文件位置
C. 非格式化I/O
2) 二进制I/O

C++学习日记和心得(一)(新手帖,高手勿笑)

我之前三年也学过其他语言,
  • u011004567
  • u011004567
  • 2014年07月11日 14:58
  • 431

学习日记-html5

已掌握:学习并使用过HTML, CSS, 但并不熟练,特别是css常用效果了解但对于不常用的能实现的效果不清晰,html的各种标签除常用部分,其他在使用时需要去查询. 今日学习:html5 发展,与...
  • trch1989
  • trch1989
  • 2017年02月06日 16:50
  • 177

linux学习日记!!

一,用户的理解 在系统中用户储存为若干字符串+若干个系统配置文件 联系到的配置文件: /etc/passwd        用户信息 /etc/shadow        用户认证信息 /e...
  • SjmMx1314aini
  • SjmMx1314aini
  • 2017年02月13日 00:04
  • 140

2016年寒假学习日记

svn配置管理 mock server 创建测试服务 junit测试 eclipse 插件开发 osgi框架 java bean和oracle type:公司实现,type编程http://blog....
  • xdyzyh
  • xdyzyh
  • 2017年02月20日 21:12
  • 169

计算机系统学习笔记<一>

计算机是由硬件软件组成的, 硬件相当于肉体而软件相当于灵魂,两者是相辅相成的。软件分为系统软件和应用软件他们和硬件的关系是应用软件位于最外层,中心是硬件,系统软件位于两者中间。   系统软件有很多种...
  • yqoneyear
  • yqoneyear
  • 2017年03月19日 20:01
  • 249

今天写了第一个java类

终于今天真的写Java代码了。写了三个类,用ksh调用的。不过基本就是抄,嘿嘿。。。在已有的project下新建package,新建class。把从别处copy来的代码改了改,很容易编译就过了。IDE...
  • OnlyQi
  • OnlyQi
  • 2011年04月23日 09:54
  • 519

闭关日记 Day06

阴夹带小雨。(挖坑晚了...)        项目B的 beta 2.1 版本已通过客户确认,开始着手各部分详情页。项目F的录音及拍照功能已实现,剩余上传至服务器及定时器的实现。目测定时器自动拍照这...
  • u013157684
  • u013157684
  • 2016年03月19日 00:53
  • 248

菜鸟shell 脚本学习日记

1、shell 脚本统计当前目录下指定后缀文件行数: 获取当前目录下所有后缀为.txt 文件行数,包含空白行(包括子目录): $find . -name "*.sh" |xargs cat |wc -...
  • cxj415
  • cxj415
  • 2017年11月29日 23:10
  • 53

Pythonday06

装饰器(器,就是函数,装饰器就是用来装饰函数的函数)普通的函数: def 函数名(形参): # 变量名 函数体 return 变量|常量pr...
  • woaixueyunwei
  • woaixueyunwei
  • 2017年09月09日 21:49
  • 58

C++学习笔记(一) 补充篇 基础语法 — 参考慕课网 值得推荐!

2016年8月23日 前段时间真的是恍然大悟,书看错了,我看的 C++ prime plus看的真心的难受,也不知道这本书到底在写什么。 2016年8月28日 一晃又过了4-5天,真快啊,发现那...
  • David_Han008
  • David_Han008
  • 2016年08月25日 16:47
  • 3087
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++学习日记day06
举报原因:
原因补充:

(最多只允许输入30个字)