没有合适的资源?快使用搜索试试~ 我知道了~
C++经典笔试题(附答案).pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 33 浏览量
2023-02-27
20:09:59
上传
评论
收藏 1000KB PDF 举报
温馨提示
试读
21页
.
资源推荐
资源详情
资源评论
8:下列多重继承时的二义性问题如何解决?
class A{
public:
void print () {cout<<"Hello, this is A"<<endl;}
};
class B{
public:
void print () {cout<<"Hello, this is B"<<endl;}
};
class C : public A, public B{
public:
void disp () {print ();}//编译器无法决定采用 A 类中定义的版本还是 B
类中的版本
};
解答:若两个基类中具有同名的数据成员或成员函数,应使用成员名限定来
消除二义性,如:
void disp () {
}
但更好的办法是在类 C 中也定义一个同名 print 函数,根据需要调用 A
::
print()
还是 B
::
print(),从 而实现对基类同名函数的隐藏
9:下列公共基类导致的二义性如何解决?
class A{
public:
void print(){
cout << "this is x in A: " <<endl;}
class B: public A{};
class C: public A{};
class D : public B, public C{};
void main(){
• 1 •
//类 A 的定义
//类 B 的定义
//类 C 由类 A 和类 B 共同派生而来
A: : print () ; //加成员名限定 A::
//公共基类
//public 成员列表
D d;
A* pa=(A*) &d;
的 print ()函数
}
//声明一个 D 类对象 d
//上行转换产生二义性
d.print () ; //print ()具有二义性,系统不知道是调用 B 类的还是 C 类
注意:把子类的指针或引用转换成基类指针或引用是 上行转换,把基类
指针或引用转换成子类指针或引用是下行转换。
解答:1) main 函数中语句“d.print()
;
”编译错误,可改为以下的一种:
d.B::print(); d.C::print();
若改为“d.A
::
print()
;
”又会如何呢?
由于 d 对象中有两个 A 类对象,故编译会报“基类 A 不明确”。
2)
语句“A*pa=(A*)&d
;
”产生的二义性是由于 d 中含有两个基类对象 A,隐
A*pa=(A*)(B*)&d; //上行转换
A*pa=(A*)(C*)&d; //上行转换
式 转换时不知道让 pa 指向哪个子对象,从而出错。可改为以下的一种:
事实上,使用关键字 virtual 将共同基类 A 声明为虚基类,可有效解决上述
问题。
) ? (2011 •腾讯)
A. class B:publicA{}
C. class B {operator A();}
B. classA : public B{}
D. class A{A(const B&);}
10:下面哪种情况下,B 不能隐式转换为 A (
解答:B。因为子类包含了父类部分,所以子类可以转换为父类,但是相反,
父类没有子类额外定义的部分,所以不能转换为子类,故A 正确,而B 错误。
非 C++内建型别 A 和 B,在以下几种情况下 B 能隐式转化为 A。
1)
B 公有继承自 A,可以是间接继承的。
class B : public A{
};
此时若有“A a; B b;”,则 “a=b
;
”合法。
2)
B 中有类型转换函数。
class B{
operator A();
.2 •
};
此时若有“A a; B b;”,则“a=b
;
”合法。
3)
A 实现了非 explicit 的参数为 B (可以有其他带默认值的参数)的构造函
数
class A {
A(const B&);
};
此时若有“A a; B b
;
”,则“a=b
;
”合法。
11 :调用一成员函数时,使用动态联编的情况是()。(2011 •淘宝)
A.通过对象调用一虚函数
C.通过对象调用静态函数
解答:B。
结合一段示例代码来看虚函数的作用,以帮助大家理解多态的意义所在。
例 2:下述代码的输出结果是什么?
class base{
public:
virtual void disp(){cout << "hello, base1" <<endl;}
void disp2(){cout <<"hello, base2" << endl;}
};
class child1:public base{
public:
void disp() {cout << "hello, child1" << endl;}
void disp2(){cout <<"hello, child2" << endl;}
void main(){
base * base=NULL;
child1 obj child1;
base=&obj childl;
base->disp();
base->disp2();
解答:输出:hello, childl
hello, base2
.3 •
B.通过指针或引用调用一虚函数
D.通过指针或引用调用一静态函数
从上述代码可见,通过指针访问函数时:
1)
不加 virtual 时,具体调用哪个版本的函数只取决于指针本身的类型,和指
而加 virtual 时,具体调用哪个版本的函数不再取决于指针本身的类型,而
针所指对象的类型无关。
2)
是取决于指针所指对象的类型。
13:构造函数为什么不能为虚函数?
解答:假设有如下代码:
class A{
A() { }
};
class B : public A{
B():A() { }
};
int main(){
B b;
B*pb=&b;
}
则构造 B 类的对象时:
1.
根据继承的性质,构造函数执行顺序是:
A()B()
根据虚函数的性质,如果 A 的构造函数为虚函数,且 B 类也给出了构造函
2.
数,则应该只执行 B 类的构造函数,不再执行 A 类的构造函数。这样 A 就不能构
造了。
3.
这样 1 和 2 就发生了矛盾。
另外,virtual 函数是在不同类型的对象产生不同的动作,现在对象还没有产
生,如何使用 virtual 函数来完成你想完成的动作。
14:哪些函数不能为虚函数?
解答:常见的不能声明为虚函数的有:普通函数(非成员函数)、静态成员函
数、构造函数、友元函数,而内联成员函数、赋值操作符重载函数即使声明为虚
.4 •
函数也无意义。
1)
为什么 C++不支持普通函数为虚函数?
普通函数(非成员函数)只能被 overload (重载),不能被 override (覆盖),
声明为虚函数也没有什么意义,因此编译器会在编译时绑定函数。
为什么 C++不支持构造函数为虚函数?
上例己经给出了答案。
2)
为什么 C++不支持静态成员函数为虚函数?
静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代
码, 它不归某个具体对象所有,所以它没有要动态绑定的必要性。
3)
为什么 C++不支持友元函数为虚函数?
因为 C++不支持友元函数的继承,没有实现为虚函数的必要。
以下两种函数被声明为虚函数时,虽然编译器不会报错,但是毫无意义。
内联函数:内联函数是为了在代码中直接展开,减少函数调用花费的代价,
虚函数是为了在继承后,对象能够准确地执行自己的动作,这是不可能统一的。
即使虚函数被声明为内联函数,编译器遇到这种情况根本不会把这样的函数内联
展开,而是当作普通函数来处理。
赋值运算符:虽然可以在基类中将成员函数 operator 定义为虚函数,但这样
做没有意义。赋值操作符重载函数要求形参与类本身类型相同,故基类中的赋值
操作符形参类型为基类类型,即使声明为虚函数,也不能作为子类的赋值操作符。
15:以下描述正确的是()。(2011 •盛大游戏)
A.
B.
C.
虚函数是可以内联的,可以减少函数调用的开销提高效率
类里面可以同时存在函数名和参数都一样的虚函数和静态函数
父类的析构函数是非虚的,但是子类的析构函数是虚的,delete 子类对
象指针会调用父类的析构函数
D •以上都不对
解答:C。C 中 delete 子类对象指针会调用父类的析构函数(即使子类的析
构 函数不是虚的,对子类对象指针调用析构函数,也会调用父类的析构函数),
但若 delete 父类对象指针却不会调用子类的析构函数(因为父类的析构函数
不是虚函数,不执行动态绑定)。
16:以下代码的输出结果是()。(2012 •小米)
class B{
.5 •
剩余20页未读,继续阅读
资源评论
xxpr_ybgg
- 粉丝: 6560
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 目标检测-零售食品LOGO检测数据集-5000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- 目标检测-零售食品LOGO检测数据集-1000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本
- Delphi 12 控件之LMD.VCL.Full.Version.zip
- 计算机科学选修课:人工智能导论 第二节 PPT
- 计算机科学选修课:人工智能导论 第一章 PPT
- 忘记navicat密码时,此工具可以帮您查看密码
- 电子商务-电子商务平台-水果销售-在线购物-果库小程序.zip
- 基于React的后台开发框架(javascript)
- 用户界面设计-滑动选项卡-交互组件-用户体验-滑动选项卡小程序.zip
- 371系列智能型电动执行机构说明书
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功