答案:C
C。解析本题针对虚基类的定义及特点考查。虚基类的声明为“class<类名>:virtual<继承方式><基类名>”,即本题的A为虚基类。
虚基类的初始化与一般多继承的初始化在语法上是一样的,但构造函数
的调用次序不同。派生类构造函数的调用次序有三个原则:(1)虚基类的构造函数在非虚基类之前调用;
(2)若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用;
(3)若虚基类由非虚基类派生而来,则仍先调用基类构造函数,再调用派生类的构造函数。
1 : 由于派生类对象中的基类对象部分是在派生类对象创建时首先被构造的,因此基类对象的数据成员的创建和初始化是先于派生类新增属性的创建和初始化的。如果基类对象的构造需要传递参数对它的数据成员进行初始化,则需要在派生类构造函数定义的初始化表中调用基类的构造函数,并将由派生类构造函数的参数表传递来的相应的参数作为实参传递给被调用的基类构造函数,用于对基类对象的初始化。例如: class point { int x, y; public: point(int x, int y); // … }; class circle public point { int radius; public: circle(int x, int y, int radius); // … } … circle::circle(int x, int y, int radius):point(x, y) { this->radius = radius; } 2 : 在C++中,类的派生有三种方式: (private)派生、 (protected)派生和公有 (public)派生。这三种派生方式对基类中具有各种访问权限的成员的继承情况如下: ① :在三种派生方式定义的派生类中都不能被直接访问,当然也不能被派 生类对象的使用者从类外直接访问。 ② :分为两种情况: · (private)派生方式定义的派生类中基类的保护成员在派生类中被变为私有成员, 因此这些成员能够被派生类成员直接访问,而不能被派生类对象的使用者从类外直接 访问; · (protected)派生方式和 (public)派生方式定义的派生类中基类的保护成员在 派生类中仍然保持为保护成员,因此这些成员能够被派生类成员和派生类的派生类成 员直接访问,而不能被派生类对象的使用者从类外直接访问。 ③ :分为三种情况: · (private)派生方式定义的派生类中基类的公有成员在派生类中被变为私有成员, 因此这些成员能够被派生类成员直接访问,而不能被派生类对象的使用者从类外直接 访问; · (protected)派生方式定义的派生类中基类的公有成员在派生类中被变为保护成 员,因此这些成员能够被派生类成员和派生类的派生类成员直接访问,而不能被派生 类对象的使用者从类外直接访问; · (public)派生方式定义的派生类中基类的公有成员在派生类中仍然保持为公有成 员,因此这些成员不但能够被派生类的成员直接访问,而且也能被派生类对象的使用 者从类外直接访问。 3 : 以任何派生方式定义派生类都不能直接访问基类的私有成员。如果要实现派生类能直接访问基类的私有成员,可以通过以下两种方法实现: ① 将基类的私有成员声明保护成员。 ② 将派生类声明为基类的友元类。 4 : 保护段成员允许类内直接访问,但不能被类对象的使用者从类外直接访问;而公有段成员不仅允许类内直接访问,而且也允许类对象的使用者从类外直接访问。 保护段成员在派生类的继承情况分为两种:在 (private)派生方式定义的派生类中基类的保护成员成为派生类的私有成员;在 (protected)派生方式和 (public)派生方式定义的派生类中基类的保护成员仍然是派生类的保护成员。 5 : 在多继承派生中,如果派生类的多个直接基类是从一个间接基类中直接派生的(会在多继承派生类对象中存在一个以上的间接基类对象),并且在多继承派生类中需要访问该间接基类的成员,则会产生访问的歧义性。解决这一问题,就必须引入虚基类,从而多继承派生类的直接基类从间接基类派生时,可以将该间接基类声明为虚基类,使得在多继承派生类对象中只有一个间接基类对象,避免了上述的访问歧义性。 虚基类中一般应该有一个不需要传递参数的构造函数。否则就必须在多继承派生类构造函数的初始化表中显式调用作为虚基类的间接基类的构造函数。 6 :⑴ 若同一派生层次中同时包含虚基类和非虚基类,应先调用虚基类构造函数,再调用非虚 基类的构造函数,即“ "; ⑵ 若同一派生层次中包含多个虚基类,这些虚基类的构造函数将按照派生类定义中对它们 声明的先后次序,从左至右调用。 ⑶ 若虚基类是非虚基类的派生,则仍然先调用该虚基类的基类构造函数,再调用派生虚基 类的构造函数。
会。使用了虚继承虚基类的构造函数会被调用一次(而不是多次)。
虚继承用来解决在菱形继承中,同一个基类被构造多次的情况。应对指出的是如果存在使用虚继承的情况,往往意味着设计出现了问题。虚继承最好不使用,或者至少是少使用
答案:B
虚基类的引入就是为j-消除。二义性,其构造函数的调用仍然是按照继承的顺序进行的,对于多个虚基类则按它们说明的次序调用,虚基类的构造函数先于非虚基类的构造函数执行。
当父类是有参的构造函数时
子类必须在构造函数的初始化列表中提供父类构造函数的实参,例如
class A
{
public:
A(int i) {};
}
class B : public A
{
public:
B();
}
B::B()
: A(3)
{
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)