c/c++笔记--5
2018-06-17 23:50:28来源:未知 阅读 ()
1、假设derived类继承自base类,那么derived与base是一种“is a”的关系,即derived类是base类,反之错误;
假设derived类虚继承自base类,那么derived与base是一种“has a”的关系,即derived类有一个指向base类的vptr。
2、virtual base class的原始模型是在class object中为每一个有关联的virtual base class加上一个指针vptr,
该指针指向virtual基类表。有的编译器是在继承类已存在的virtual table直接扩充导入一个virtual base class table。
不管怎么样由于虚继承已完全破坏了继承体系,不能按照平常的继承体系来进行类型转换。
3、编译器必须保证虚函数表的指针存在于对象实例中最前面的位置。这意味着只要通过对象实例的地址就能得到虚函数表,
然后就能遍历其中的函数指针,并调用相应的函数。
4、void f(int value)
{
try{
if(someFunction())
{
throw value;
}
}
catch(double d){
}
}
如果someFunction()返回true,就抛出一个int,但是catch子句处理类型为double的exceptions。
try语句块中抛出的int exception绝不会被用来捕捉double exception的catch子句捕捉到,后者只能捕捉类型确确实实为
double的exceptions,其间不会有类型转换的行为发生。
5、“exceptions与catch子句相匹配”的过程中,仅有两种转换可以发生。第一种是“继承架构中的类转换”,即base class exceptions的catch子句可以捕捉类型为derived class的exceptions。第二种允许发生的转换是从一个“有型指针”转换为“无型指针”,即一个const void*指针的catch子句可以捕捉任何指针类型的exception。
6、catch子句总是依出现顺序做匹配尝试:
try{
}
catch(base class& ex){
}
catch(derived class& ex){
}
第二个catch子句将不会执行起来,因为所有的derived class exceptions都会被base class的catch子句捕捉。
上述这样的代码在c++中通常是不正确的,编译器可能会发出一个警告,甚至错误消息。因此,绝对不要将base class的catch子句放在derived class的catch子句之前。应改为:
try{
}
catch(derived class& ex){
}
catch(base class& ex){
}
先捕捉derived class exceptions,再捕捉base class exceptions。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:【学习整理】NOIP涉及的数论 [updating]
下一篇:LZO 使用和介绍
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash