C++类

一、继承:

1. 派生类是基类的is-a(is-a-kind-of)关系。

2.基类的所有功能对派生类都有意义。

3.虚继承是解决多重继承中,对基类二义性问。详细原理参考http://blog.csdn.net/u013630349/article/details/47057929。

二、组合:

1.类B由类A组合而成,一般称为is-a-part-of关系。

三、多态:

1.每一个多态类有一个虚函数表(函数指针数组,放在静态数据区,不属于实例,每个实例用虚函数指针访问),包含虚函数的地址和类型信息,函数调用类似于:(*(p->vptr[slotNum]))(p, arglist).

2.虚函数必须有相同的函数原型,但是返回类型可以不同。

3.多态对象数组,访问时可能访问错位,释放内存时子类可能没有释放。

4.派生类不能继承基类的静态成员。

5.基类已经插入vptr,则派生类继承并重用vptr。

6.派生类继承多个类,每个继承分支继承一个vptr。

7.vptr一般放在数据成员的最前面,为支持RTTI,为每个多态类创建一个type_info对象,地址保存在vtable的固定位置(一般在第一个位置)。

8.由于每个虚函数原型可能不同,虚函数表将所有函数强制转换为一个类型,保存函数地址,运行使用时,根据实例对象強转为对应的函数,函数调用类似于:(*(Realtype)(p->vptr[slotNum]))(p, arglist)..

9.vptr在构造函数中初始化,先初始化基类的vtable,再根据派生类不断修改vtable,在vtable同一位置覆盖原有基类的虚函数。

10.构造函数先初始化vptr,因此构造函数内部可以使用多态调用虚函数。

 

四、基本元素:

1.vptr,默认构造函数,默认析构函数,默认拷贝构造函数,默认赋值函数。

 

五、对象:

1.默认构造函数和默认赋值函数会调用每个数据成员的默认构造函数和默认赋值函数,基本数据类型则按bit拷贝。

2.构造函数的初始化列表工作在函数体执行之前,规则如下:

1) 类存在继承关系,需要在初始化列表调用基类的构造函数。

2)非晶态const数据成员和引用成员只能在初始化列表调用。

3)数据成员是类的话,放在函数体内初始化效率低,如:

A::A(const A& a)

{

  m_a =a;

}

先调用A的默认构造函数初始化m_a,再调用A的赋值函数将a传给m_a。

4)类的初始化规则,先在初始化列表调用基类构造函数,接着在初始化列表调用本类的数据成员,最后在函数体内完成其他初始化工作。

 

3.不能同时定义无参构造函数和所有参数都有默认值的构造函数。

 

4.拷贝构造函数参数必须是同类对象的引用,不能是对象值,没有其他参数,或者其他参数都有默认值。

 

5.基类的构造函数、析构函数和赋值函数都不能被派生类继承。

 

6.派生类的构造函数应该用初始化列表显示调用基类的构造函数。

 

7.如果基类是多态的,基类的析构函数需要定义为虚函数。

 

8.派生类赋值函数中,需要对基类的数据成员重新赋值,可以调用基类的赋值函数实现。

 

posted @ 2017-11-19 17:48  一种微笑  Views(158)  Comments(0)    收藏  举报