oop语言的三大特性:封装与隐藏、继承、多态。
1、继承
继承的意义在于代码的复用,除了基类的构造函数和析构函数外,派生类会继承基类的所有成员方法与成员变量,但成员方法不占用内存。
所以在计算sizeof时,一定要把基类成员变量的内存加上。
2、关于基类成员变量的访问限定
3、派生类对象的构造方式
先构造基类对象,在构造派生类对象,析构时先析构派生类对象,在析构基类对象。
4、基类和派生类成员方法之间的关系
重载:
1、在同一个作用域中;
2、函数名相同,参数列表不同,可以构成函数重载
3、用const/volatile修饰&或者*时能构成重载。
隐藏:在基类与派生类的继承关系中,返回值,函数名相同,参数列表相同,基类中的成员方法会被隐藏,所以在调用基类的同名函数时必须加基类作用域
覆盖:在基类与派生类的继承关系中,基类成员方法返回值,函数名,参数列表都相同,并且是vitural的(派生类不用写vitural也是vitural函数哦),就能构成覆盖,重写基类在派生类中的方法。
5、派生类不支持从上到下的转换,只支持从下(派生类)到上(基类)的转换。
派生类对象 = 基类对象 flase
基类对象 = 派生类对象 true
基类指针 = 派生类对象 true
派生类指针 = 基类对象 flase
6、C++的4种类型强转
const_cast 转换符是用来移除变量的const或volatile限定符
static_cast 非多态的转换,用于代替C中通常的转换操作,被作为显示类型转换
reinterpet_cast 将数据从一种类型的转换为另一种类型
dynamic_cast 将一个基类对象指针(或引用)cast到继承类指针
7、虚函数表
编译器为有虚函数的类产生一张虚函数表,这张虚表被该类的所有对象共享,类的每个虚成员占据虚函数表中的一行。如果类中有N个虚函数,那么其虚函数表将有N*4字节的大小。在有虚函数的类的实例中分配了指向这个表的指针的内存,所以,当用父类的指针来操作一个子类的时候,这张虚函数表就显得尤为重要了,它就像一个地图一样,指明了实际所应该调用的函数。
编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下)。 这意味着可以通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。
8、什么情况下会发生动态绑定?
只有通过指针或者引用调用虚函数时会发生动态绑定
9、当基类指针指向一个在堆上的派生类对象时,需要把基类析构函数写成vitural,否则成了静态绑定,会调用基类的析构函数,导致派生类析构不了。