引入虚基类就是为了解决什么问题?怎样定义虚基类?带有虚基类的派生类的构造函数有什么特点?
多继承层次结构可能很复杂,派生类从同一基类中继承多次,这样一来就会出现基类的两个或两个以上的副本,编译器不知道应该访问哪个副本,造成二义性问题,因此就会发生错误。为了避免出现基类的两个副本,使用虚基类。 声明虚基类的格式:class 派生类名::virtual继承方式 基类名 虚基类及派生类构造函数的调用顺序① 虚基类的构造函数在所有非虚基类之前调用。② 若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用。③ 若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数。
举一反三
- 关于虚基类,下列描述正确的是( ) A: 虚基类用于解决浅复制的问题 B: 虚基类用于解决访问二义性的问题 C: 虚基类不能解决派生类继承得到的同一基类成员的多份拷贝问题 D: 实例化对象时,所有派生类的构造函数都会调用虚基类的构造函数
- 怎样定义基类虚方法,并在派生类中重写基类虚方法?
- 下列关于友元的描述中,错误的是( )。 A: 在建立虚基类的派生对象时,只有最远派生类的构造函数调用虚基类的构造函数。 B: 在建立虚基类的派生对象时,虚基类构造函数的调用次数与虚基类下面的派生类个数有关。 C: 设置虚基类的目的是消除二义性 。 D: 虚基类可以实例化一个或多个对象。
- “虚基类”是通过什么方式定义的?如果类A有派生类B、C,类A是类B虚基类,那么它也一定是类C的虚基类吗?为什么? 具有虚继承的类体系中,建立派生类对象时,以什么顺序调用构造函数?请用简单程序验证你的分析
- 带有基类的多层派生类构造函数的成员初始化列表中都要排出虚基类的构造函数,这样将对虚基类的子对象初始化:
内容
- 0
下面描述中,正确的是( )。 A: 虚拟继承可以解决多重继承中的二义性问题 B: 类层次中的类从虚基类中直接继承虚基类的成员 C: 在有虚基类的类层次中,创建派生类对象时,会先调用基类的构造函数再调用虚基类的构造函数 D: 在有虚基类的类层次中,销毁派生类对象时析构函数的调用顺序与创建派生类对象时构造函数的调用顺序相反
- 1
下列有关类继承的表述中,错误的是 A: 派生类可以继承多个基类 B: 派生类构造函数要负责调用基类的构造函数 C: 虚基类可以解决由多继承产生的二义性问题 D: 虚基类可以解决由多继承产生的二义性问题
- 2
【单选题】关于虚函数重定义的说法中,错误的是()。 A. 基类与派生类中虚函数必须同名 B. 基类与派生类中虚函数必须参数相同 C. 基类与派生类中虚函数返回类型必须相同 D. 基类与派生类中虚函数返回类型可以不同
- 3
下列有关派生和继承的表述中,错误的是____。 A: 若派生类没有实现基类中的一个纯虚函数,则该派生类是抽象类 B: 在定义派生类时,可以用关键字virtual将某个基类指定为虚基类 C: 在生成派生类对象时,派生类构造函数要调用基类的构造函数 D: 派生类中定义的成员函数可以访问基类的所有成员
- 4
______是一个在基类中说明的虚函数,它在基类中没有定义,但可以在派生类中定义。 A: 虚析构函数 B: 虚构造函数 C: 纯虚函数 D: 静态成员函数