1.虚基类
在多重继承的情况下,派生类具有两个以上的直接基类,而这些直接基类的一部分或全部又是从另一个共同基类派生而来的,这些直接基类中从上一级基类继承来的成员拥有相同的名称,在派生类的对象中,这些同名成员在内存中同时拥有多个拷贝,如何进行分辨呢?有两种方法,一是使用作用域运算符唯一标帜并分别访问它们;二是将直接基类的共同你基类设置为虚基类。
(1)使用作用域运算符方法
这种方法就是在需要访问的成员名前加上直接基类名和作用域运算符“::“。其格式是:
直接基类名::数据成员名
直接基类名:成员函数名(参数表)
(2)虚基类的方法
该方法就是将直接基类的共同基类设置为虚基类,即在基类的访问方式前加上关键字“virtual“,声明虚基类的格式如下:
class 派生类名:virtual 访问方式 基类名
{ //声明派生类成员};
虚基类虽然被一个派生类间接地多次继承,但派生类却只继承一份该基类的成员,这样就避免了在派生类中访问这些成员时的二义性。
2.虚基类机制下的构造函数的执行顺序
虚基类机制下的构造函数的执行顺序与一般多重继承下的构造函数的执行顺序是不同的,其执行顺序如下:
(1)一个类的所有直接基类中,虚基类的构造函数在非虚基类之前调用;
(2)如果一个类的所有直接基类中有多个虚基类,则这些虚基类的构造函数的执行顺序与在派生类中的说明的次序相同;
(3)若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再按照派生类中构造函数的执行顺序调用。
3.纯虚函数
纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要定义自己的版本,纯虚函数的声明格式为:
Virtual 函数类型 函数名(参数表) = 0;
实际上,它与一般虚函数成员的原型在书写格式的不同在于后面加了“ = 0”。
声明为纯虚函数之后,基类中就不再给出函数的实现部分。纯虚数的函数体由派生类给出。
注意:函数体为空的虚函数和纯虚函数的区别:
纯虚函数从根本上就没有函数体,而空的虚函数的函数体为空。前者所在的类是抽象类,不能直接进行实例化,而后者所在的类是可以实例化的。