【摘要】:在多继承情况下,可能会造成基类中某个成员访问出现不唯一的情况,称为对基类成员访问的二义性问题。而要解决第二种二义性问题,就需要使用到虚基类了。虚基类的说明用在定义派生类时,写在派生类名的后面。若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类中构造函数的执行顺序。
在多继承情况下,可能会造成基类中某个成员访问出现不唯一的情况,称为对基类成员访问的二义性问题。例如,存在一个公共基类A,公有方式派生出两个子类B 和C,B 和C中都有一个公有成员函数play(),再使用多继承公有继承B和C 产生一个D 类,则在D 类对象中就存在两个分别从B和C继承来的成员函数play(),存在两套从A 类继承下来的成员,则在用D 对象访问这些成员时如果不加指明的话,将产生二义性问题而报错。
解决第一种二义性问题,可以采用作用域运算符::来加以限定,如B::play()表示调用B类的play()成员函数,C::play()表示调用C类的play()成员函数。
【例5.5】共同基类的多继承产生的二义性问题。
而要解决第二种二义性问题,就需要使用到虚基类了。虚基类的说明方法为:
virtual< 继承方式> < 基类名>
其中,virtual是声明虚基类的关键字。虚基类的说明用在定义派生类时,写在派生类名的后面。
【例5.6】使用虚基类解决二义性问题。(www.daowen.com)
虚基类的本质就是保证从不同路径继承过来的该类成员在内存中只拥有一个备份,这样就解决了同名成员的标识唯一性问题了。
虚基类的初始化与一般的多继承类的初始化在语法上一样,但构造函数的调用顺序不同。其区别在于:
(1)虚基类的构造函数在非虚基类之前调用。
(2)若同一层次中存在多个虚基类,则按派生类定义时的说明顺序调用。
(3)若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类中构造函数的执行顺序。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
有关面向对象程序设计的文章