1.A是B的父类,B是C的父类,如果想在类C中访问到类A中的protected成员,B继承自A的权限可以是以下哪种( )。

public和protected
仅protected
protected和private
public和private

2.关于继承后的派生类,以下说法正确的是( )。

当派生类为私有继承时,父类中的所有成员均无法访问到
派生类中无法访问到基类的私有成员
保护继承后,子类的类域外依然可以访问父类的公有成员
派生类中包含基类中除了私有成员之外的所有成员

3.若有以下代码,执行的结果为( )。

include
class Test{
public:
Test(){std::cout << “Test构造 “;}
};
class Base{
public:
Base(){std::cout << “基类构造 “;}
private:
Test objA;
};
class Subclass:Base{
public:
Subclass(){
std::cout << “子类构造 “;
}
private:
Test objB;
};
int _tmain(int argc, _TCHAR* argv[]) {
Subclass obj;
return 0;
}
父成子。子类肯定在最后
Test构造 基类构造 Test构造 子类构造
子类构造 基类构造 Test构造
基类构造 Test构造 子类构造 Test构造
Test构造 基类构造 子类构造 Test构造

4.当产生菱形继承时,顶层类称为爷爷类,中间层类称为父类,最底层称为孙子类,那么定义孙子类对象,如何让爷爷类中的数据成员只有一份( )。

大家都使用纯虚函数机制
孙子类虚继承所有父类
在爷爷类中安排虚函数
父类全部虚继承自爷爷类

5.类B虚继承自类A后,相比于类B非虚继承自类A的内存排布变化为( )。

类A中的数据与类B将交叉排布
因为虚基类表指针的原因,整体上的大小会比原来大8个字节
类A中的数据依然排在类B的数据之前
因为虚基类表指针的原因,整体上的大小会比原来大4个字节

6.有如下声明:

class CAD { }; class Vehicle { };
class CADVehicle : public CAD, Vehicle { };
请问类CADVehicle 是以( )方式继承类Vehicle的:
因为 Vehicle前面没有指定修饰符, 所以上述写法是错误的
public
private
protected

7.根据如下代码选择正确答案( )。

class CTest
{
public:
CTest():m_chData(‘\0’),m_nData(0)
{
}
virtual void mem_fun(){}
private:
char m_chData;
int m_nData;
static char s_chData;
};
char CTest::s_chData=’\0’;
问:
静态变量不放在类空间,和全局变量在一起
类里有虚函数需要存一个虚函数表指针
(1)若按4字节对齐sizeof(CTest)的值是多少?
(2)若按1字节对齐sizeof(CTest)的值是多少?

10 10
16 4
16 10
12 9

8.以下不是C++中多态机制的是( )。

虚函数
函数重载
虚继承
模板

9.下列函数可以是虚函数的是( )。

首先必须是类内成员函数,构造函数也不能为虚函数
image.png
不能为虚函数的函数:构造函数、友元函数、全局函数、静态函数、拷贝构造函数、
析构函数
友元函数
全局函数
静态函数

10.以下基类中的成员函数,哪个表示纯虚函数( )。

virtual void f(int)
virtual void f(int){}
virtual void f(int)=0
void f(int)=0

11.下列描述中,哪个是抽象类的特性( )。

可以进行构造函数的重载
可以说明为虚函数
可以定义友元函数
不能实例化对象

12.类B继承自类A,类C继承自类B,当定义类C的对象时( )

若类A中有虚函数而类C中没有,则对象中不会有虚函数表指针
类A,类B,类C,无论谁定义了虚函数,对象中一定会有虚函数表指针
对象中只可能有一个虚函数表指针
对象中虚函数表指针与虚基类表指针是不能共存的 可以共存的

13.以下代码的输出为( )。

class CParent
{
public:
virtual void Intro()
{
printf( “I’m a Parent, “ );
Hobby();
}
virtual void Hobby()
{
printf( “I like football!” );
}
};
class CChild : public CParent
{
public:
virtual void Intro()
{
printf( “I’m a Child, “ );
Hobby(); 调用的还是子类的虚函数”printf( “I like basketball!\n” ); “
}
virtual void Hobby()
{
printf( “I like basketball!\n” );
}
};
int main( void )
{
CChild pChild = new CChild();
CParent
pParent = (CParent *) pChild;
pParent->Intro();
return(0);
}
I’m a Parent,I like football!
I’ma Child, I like football!
I’ma Parent, I like basketball!
I’ma Child, I like basketball!

14.下面有关C++概念的描述,说法错误的是( )。

封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
隐藏是指派生类中的函数把基类中相同名字的函数屏蔽掉了
重写是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同,能够根据传参的不同自动区分该调用哪个函数
image.png

继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展

15.C++泛型编程通过( )实现。

typedef
void
NULL
template

16.下面有关C++中为什么用模板的原因,描述错误的是( )。

它运行时检查数据类型,保证了类型安全
它是类型无关的,因此具有很高的可复用性
可用来创建动态增长和减小的数据结构
它是平台无关的,可移植性

17.下面的throw表达式中, 哪一个是错误的( )。

class exception{};throw exception;改成throw exception()变成抛出对象就行了
类型不能直接throw,只能是某个确定的值
enum MathError{ overflow, underflow, zerodivide };throw overflow;
long excpobj; throw excpobj;
long excpobj = 0;long pl = &excpobj;throw pl;

18. C++程序将可能发生异常的程序块放置在( )。

except块中
throw块中
try块中
catch块中

19.对于下面的代码,说法正确的是( )。

  1. const char* s1 = "Hello world"; <br /> char s2[] = "Hello world"; <br /> s1[2] = 'E'; // 1 <br /> s2[2] = 'E'; // 2 <br /> *(s1 + 2) = 'E'; // 3 <br /> *(s2 + 2) = 'E'; // 4 <br />数组定义初始化之后不可以一次性再赋值,只能挨个赋值,*s1不能改变,*s1代表常量区的Hello world,常量区是不能改变的,s1[2]代表常量区的l,也是不能被改变的<br />仅语句2是非法的<br />仅语句1是非法的<br />语句1~4都是合法的<br />语句3、4是非法的<br />语句2、4是非法的<br />语句1、3是非法的<br />20.已知: long lVal = 5; 下面那些定义无效( )。 <br />const long& lRef = 5;<br />const long& lRef = lVal;<br />long& lRef = lVal;<br />long& lRef = 5;