一:虚基类
解决二义性,防止双份拷贝间接基类。(否则得用作用域分辨符来区分进行的多个拷贝)
将共同基类设置为虚函数,这是从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。
虚基类的声明是在派生类的定义过程中进行的,语法形式为:
class 派生类名:virtual继承方式 基类名
虚基类及派生类的构造函数,例如:
#include
usingnamespace std;
classB0
{
};
classB1:virtual public B0
{
};
classB2:virtual public B0
{
};
classD1:public B1,public B2
{
};
二:虚函数
1)虚函数主要是实现运行时多态。虚函数的声明智能出现在类定义中的函数原型声明中,2)而不能在成员函数实现的时候。
2)只有使用指针或者引用的方式调用虚函数时,虚函数才能起到运行时多态的作用。
3)在程序中如果派生类没有显式的给出虚函数的声明,系统会根据以下规则来判断派生类中的函数成员是否是虚函数:
*是否与基类的虚函数有相同的名称
*是否与基类的虚函数有相同的参数个数及相同的对应参数类型。
*相同的返回值
4)只有虚函数是动态绑定的,如果派生类需要修改基类的行为,就应该将基类中相应的函数声明为虚函数。
5)再重写继承来的虚函数时,如果函数有默认的形参值,千万不要重新定义不同的值。原因是:虽然虚函数是动态绑定的,但默认值是静态绑定的。
6)在c++中不能声明虚构造函数,但可以声明虚析构函数,如果一个类的析构函数声明为虚函数,那么他派生而来的所有子类的析构函数也是虚函数。保证使用基类类型指针就能够调用适当的析构函数针对不同的对象进行清理工作。
#include
usingnamespace std;
classBase
{
};
classDerived:public Base
{
};
Derived::Derived()
{
};
Derived::~Derived()
{
};
voidfun(Base *b)
{
}
intmain()
{
}
如果父类没声明为虚函数,则不会调用子类的析构函数,造成内存泄露。
三:抽象类
抽象类是为了抽象和设计的目的建立的,建立抽象类是为了通过它多态的使用其中的成员函数。抽象类处于类层次的上层,抽象类无法实例化。
1)
virtual 函数类型 函数名(参数表)=0;
2)带有纯虚函数的类为抽象类,抽象类不能实例化,但我们可以声明一个抽象类的指针和引用,通过指针和引用,我们就看就可以访问派生类对象,这种访问具有多态性特征。