一、三种继承方式
private 基类的公有成员与保护成员成为派生类的私有成员
public 基类的成员访问权限不变
protected 基类的公有成员与保护成员将成为派生类的保护成员
二、三种继承方式的对比:
三、在没有虚函数的情况下,类指针调用函数是注意:
四、虚函数表:
定义:
为了达到动态绑定(后期绑定)的目的,C++编译器通过某个表格,在执行期"间接"调用实际上欲绑定的函数(注意"间接"字眼).这样的表格称为虚函数表(常被称为vtable).每一个"内含虚函数的类",编译器都会为它做一个虚函数表,表中的每一个元素都指向一个虚函数的地址.此外,编译器当然会为这个类加上一项成员变量,是一个指向这个虚函数表的指针(常被称为vptr),且每个由此派生出来的对象,都会有这个一个vptr.
介绍:
当我们通过这个对象调用虚函数时,事实上是通过vptr找到虚函数,再找出真实的地址,虚函数表用这种间接的的方式,虚函数表的内容是依据类中的虚函数声明次序,意义填入函数表(以及所有其他可以继承的成员),当我们在派生类中改写虚函数时,虚函数表就受了影响:表中元素所指的函数地址将不再是基类的函数地址,而是派生类的地址
声明格式:
class 派生类名:继承方式(若不具体指出默认为private) 基类名 { … };
特性:
继承了基类所有属性与行为,包括私有成员,但不允许派生类直接访问基类私有成员
构造函数:
格式: 派生类构造函数名(形参表):基类构造函数名(形参表){…}
要点:
● 创建派生类对象时,程序首先创建基类对象,即基类对象应在进入派生类构造函数前被创建完成 (即先调用基类构造函数,后调用派生类构造函数) ● 派生类构造函数应通过成员初始化表将基类信息传递给基类构造函数 ● 派生类构造函数应初始化派生类新增的数据成员
析构函数:
特性: 派生类对象过期时,程序将首先调用派生类析构函数,然后调用基类的
虚析构函数:
作用: 和虚函数一样类似,在用基类指针释放派生类对象时候,为了能调用正确的析构函数.
注意: 当一个类有虚函数功能,它经常作为一个基类使用,并且它的派生类经常使用new来分配,那么它最好也使用虚析构函数,因为这样才能保证在释放实例对象的时候调用正确的析构函数
注意:
声明格式:
class 派生类名:继承方式 基类名,继承方式 基类名… {….};
构造函数:
派生类名::派生类名(形参表):基类名(形参表),基类名(形参表)…{…}
处理同一层的基类构造函数的执行顺序取决于定义派生类对各基类的排列顺序,与定义派生类的构造函数时基类的排列顺序无关
原因:
方法:
虚基类:
声明格式: class 派生类名:virtual 继承方式 基类名,… { … };
注意:
有虚基类和无虚基类的区别:
构造函数的顺序与继承顺序有关,而不是基类构造函数的调用有关
原文:http://www.cnblogs.com/xietianjiao/p/5498225.html