1.派生类对象由多个部分组成:派生类本身定义(非static)成员加上由基类(非static)成员组成的子对象。
2.多继承的定义格式。
clash 派生类名:继承方式1 基类名1,继承方式2 基类名2{};
3如果一个类有多个直接基类,而直接基类又有一个共同的基类,则在最低层的派生类中会保留这个间接的共同基类数据成员的多份同名成员。
4.基类成员在派生类中的访问属性
基类中的私有成员都不允许派生类继承,即在派生类中不可见。
public 继承 : 外部可以访问public,其他不可见。内部函数或者友元函数可以访问protect和public
protect继承: 外部不可以访问。 内部函数或者友元函数可以访问protect和public
private继承: 外部不可访问。 内部函数或者友元函数可以访问protect和public。无法往下继承。
5.c++基本类型的指针之间不含有隐式转换(void *除外,const的某些用法是为了兼容c语言也可以隐式转换),需要显示转换。故char *不能隐式的转换成int *
而仅当类型之间可以隐式转换(除类层次间的下行转换),static_cast的转换才是合法的,否则将出错。
6.自定义类型的转换规则:
《1.在公有继承方式下,(私有、保护继承不能发生隐式转换),派生类的对象、对象指针、对象引用可以赋值给基类(发生隐式转换)基类不可以直接赋值给派生类。因为派生类包含了基类的所有信息,而基类缺乏派生类中的信息。
《2.c++允许把基类的对象指针 /引用 强制转换(显示)成派生类的对象指针/引用。
《3.一个指向基类的指针可以用来指向该基类公有派生类的任何对象。实现多态。
7.把子类的指针或引用转换成基类指针或引用是上行转换。注意:在派生类和基类进行比较的时候,可能会发生隐式转换,派生类转换成基类。
8.在多基继承时,如果多个基类中存在同名成员的情况,造成编译器无从判断具体要访问哪个基类中的成员,则称为对基类成员访问的二义性问题。
若具有同名的数据成或成员函数,应使用成员名限定来消除二义性。
A;; 成员名限定
或这命名个同名函数。
9菱形继承。或喊声重叠子对象。采用虚基类,可以解决。
10.转换构造函数
11.类型转换函数
转换函数必须是成员函数,不能是友元形式,不能制定返回类型,但在函数体内必须用return语句以传值方式返回一个目标类型的变量,转换函数不能有参数。
operator in t() { return int;}
12.C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。
13.多态性是指同一个操作作用于不同的对象就会产生不同的响应。
C++依靠虚函数实现动态多态的。
14.C++通过虚函数实现动态联编。
15.使用指针访问非虚函数时,编译器根据指针本身的类型决定要调用哪个函数。不是动态联编。
使用指针访问虚函数时,编译器根据指针所指对象的类型决定要调用哪个函数(动态联编)
引用和指针类似,不同的是引用一经声明后,引用变量本身无论如何改变,其调用的函数就不会改变,始终指向开始定义的函数。
16 派生关系中的基类析构函数声明为虚函数。
17 虚函数表指针vptr
虚基类表指针bptr
18虚函数表指针
对象中的静态防止在程序的全局存储区,故不会影响个别的对象的大小。static和非static也放在所有的对象之外。
每一个类产生一堆指向虚函数的指针,放在虚函数表。
每个对象添加了一个指针,指向相关的虚函数表。vptr 是对象中有的虚函数表指针。
19 普通函数不存在于对象中,虚函数要使用到虚表指针(存在于对象中)
20.结构或者类中的静态成员不对结构或者类的大小产生影响。
21空类的大小为1
22.多基继承时,有几个基类就有几个vptr.
23.虚基类表指针
在虚拟继承的情况下,基类不管在继承串链中被派生多少次,永远只会存在一个实体。
在虚拟继承基类的子类中,子类会增加某种形式的指针,或者指向虚基类子对象,或者指向一个相关的表格,此指针成为bptr
在同时存在vptr和bptr时,某些编译器会将其进行优化,合并为一个指针。
24.凡是含有纯虚函数的类称为抽象类。这种类不能声明对象,只是作为基类为派生类服务。除非在派生类中完全实现基类中所有的纯虚函数,否则,派生类也是抽象类,不能实例化对象。 纯虚函数后面声明=0
只定义了protected型构造函数的类也是抽象类。
25.抽象类不能定义对象,但是可以作为指针或者引用类型使用。
26.运行时类型识别,程序能够使用基类的指针或引用来检索这些指针或引用所指对象的实际类型。
typeid 操作符,返回指针或引用所指对象的实际类型。
dynamic _cast操作符 ,将基类类型的指针或引用安全的转换为派生类型的指针或引用。
27.显式转换也程为强制类型转换,包括以下名字命名的强制类型转换操作符
static_cast 编译器隐式执行的任何类型转换都可以由static_cast显示执行。但是仅当类型之间可隐式转换时,static_cast才是合法的,否则将出错。
c++基本类型的指针之间不含有隐式转换(void *除外,const的某些用法是为了兼容c语言也可以隐式转换),需要显示转换。故char *不能隐式的转换成int *
而仅当类型之间可以隐式转换(除类层次间的下行转换),static_cast的转换才是合法的,否则将出错。
dynamic_cast把表达式转换成type类型的对象。type必须是类的指针、类的引用或者vodi*
涉及运行时类的检查,dynamic_cast运行时需要检查需要运行时类型的信息,必须是定义了虚函数的类。没有虚函数表的类使用会编译错误。
如果转换到指针类型的dynamic_cast失败,则返回0
如果转换到引用类型的dynamic_cast失败 则异常
如果dynamic_cast操作数中的类无虚函数,则会提示dynamic_cast的操作数必须包含多态类型。
const_cast 将转换表达式的const性质,去掉const
reinterpert_cast 效果和使用圆括号实现相似。
28.在面对对象技术中,多态性是指针对一消息,不同对象可以以适合自身的方式加以响应。
29.切记 虚函数的范文。使用指针访问虚函数时,必须要用到vptr,虚函数指针存在于具体的对象中。
30.static _cast(p) 如果base *p=&d 其中d是子类。则 static_cast会自动隐式转换成base类。这个要注意!!!
31栈上的内存不需也不能调用delete删除。
32 extern可以用在变量上,也可以用在函数上。
33.如果dynamc_cast转换的类之间没有关系,则转换成的指针将为空。