没有合适的资源?快使用搜索试试~ 我知道了~
C++经典笔试题(附答案).docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 142 浏览量
2023-02-27
20:09:58
上传
评论
收藏 195KB DOCX 举报
温馨提示
![preview](https://dl-preview.csdnimg.cn/87510037/0001-e81d29e9926ef6d3c46e35fe94836796_thumbnail-wide.jpeg)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
试读
21页
.
资源推荐
资源详情
资源评论
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/release/download_crawler_static/87510037/bg1.jpg)
8:下列多重继承时的二义性问题如何解决?
class A{
public:
//类 A 的定义
void print () {cout<<"Hello, this is A"<<endl;}
};
class B{
public:
//类 B 的定义
void print () {cout<<"Hello, this is B"<<endl;}
};
class C : public A, public B{
//类 C 由类 A 和类 B 共同派生而来
public:
void disp () {print ();}//编译器无法决定采用 A 类中定义的版本还是 B
类中的版本
};
解答:若两个基类中具有同名的数据成员或成员函数,应使用成员名限定来
消除二义性,如:
void disp () {
A: : print () ; //加成员名限定 A::
}
但更好的办法是在类 C 中也定义一个同名 print 函数,根据需要调用 A print()
::
还是 B print(),从 而实现对基类同名函数的隐藏
::
9:下列公共基类导致的二义性如何解决?
class A{
public:
//公共基类
//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 •
![](https://csdnimg.cn/release/download_crawler_static/87510037/bg2.jpg)
D d;
//声明一个D 类对象d
A* pa=(A*) &d; //上行转换产生二义性
d.print () ; //print ()具有二义性,系统不知道是调用B 类的还是C 类
的 print ()函数
}
注意:把子类的指针或引用转换成基类指针或引用是 上行转换,把基类
指针或引用转换成子类指针或引用是下行转换。
解答:1) main 函数中语句“d.print() ”编译错误,可改为以下的一种:
;
d.B::print(); d.C::print();
若改为“d.A print() ”又会如何呢?
::
;
由于d 对象中有两个A 类对象,故编译会报“基类A 不明确”。
语句“A*pa=(A*)&d ”产生的二义性是由于d 中含有两个基类对象A,隐
2)
;
式 转换时不知道让 pa 指向哪个子对象,从而出错。可改为以下的一种:
A*pa=(A*)(B*)&d; //上行转换
A*pa=(A*)(C*)&d; //上行转换
事实上,使用关键字 virtual 将共同基类 A 声明为虚基类,可有效解决上述
问题。
10:下面哪种情况下,B 不能隐式转换为A ( ) ? (2011 •腾讯)
A. class B:publicA{}
B. classA : public B{}
C. class B {operator A();}
D. class A{A(const B&);}
解答:B。因为子类包含了父类部分,所以子类可以转换为父类,但是相反,
父类没有子类额外定义的部分,所以不能转换为子类,故A 正确,而B 错误。
非 C++内建型别A 和 B,在以下几种情况下B 能隐式转化为A。
B 公有继承自A,可以是间接继承的。
1)
class B : public A{
};
此时若有“A a; B b;”,则 “a=b ”合法。
;
B 中有类型转换函数。
2)
class B{
operator A();
.2 •
![](https://csdnimg.cn/release/download_crawler_static/87510037/bg3.jpg)
};
此时若有“A a; B b;”,则“a=b ”合法。
;
A 实现了非 explicit 的参数为 B (可以有其他带默认值的参数)的构造函
3)
数
class A {
A(const B&);
};
此时若有“A a; B b ”,则“a=b ”合法。
;
;
11:调用一成员函数时,使用动态联编的情况是()。(2011 •淘宝)
A.通过对象调用一虚函数
B.通过指针或引用调用一虚函数
D.通过指针或引用调用一静态函数
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 •
![](https://csdnimg.cn/release/download_crawler_static/87510037/bg4.jpg)
从上述代码可见,通过指针访问函数时:
不加 virtual 时,具体调用哪个版本的函数只取决于指针本身的类型,和指
1)
针所指对象的类型无关。
而加 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 就不能构
造了。
这样 1 和 2 就发生了矛盾。
3.
另外,virtual 函数是在不同类型的对象产生不同的动作,现在对象还没有产
生,如何使用 virtual 函数来完成你想完成的动作。
14:哪些函数不能为虚函数?
解答:常见的不能声明为虚函数的有:普通函数(非成员函数)、静态成员函
数、构造函数、友元函数,而内联成员函数、赋值操作符重载函数即使声明为虚
.4 •
![](https://csdnimg.cn/release/download_crawler_static/87510037/bg5.jpg)
函数也无意义。
为什么 C++不支持普通函数为虚函数?
1)
普通函数(非成员函数)只能被 overload (重载),不能被 override (覆盖),
声明为虚函数也没有什么意义,因此编译器会在编译时绑定函数。
为什么 C++不支持构造函数为虚函数?
上例己经给出了答案。
为什么 C++不支持静态成员函数为虚函数?
2)
静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代
码, 它不归某个具体对象所有,所以它没有要动态绑定的必要性。
为什么 C++不支持友元函数为虚函数?
3)
因为 C++不支持友元函数的继承,没有实现为虚函数的必要。
以下两种函数被声明为虚函数时,虽然编译器不会报错,但是毫无意义。
内联函数:内联函数是为了在代码中直接展开,减少函数调用花费的代价,
虚函数是为了在继承后,对象能够准确地执行自己的动作,这是不可能统一的。
即使虚函数被声明为内联函数,编译器遇到这种情况根本不会把这样的函数内联
展开,而是当作普通函数来处理。
赋值运算符:虽然可以在基类中将成员函数 operator 定义为虚函数,但这样
做没有意义。赋值操作符重载函数要求形参与类本身类型相同,故基类中的赋值
操作符形参类型为基类类型,即使声明为虚函数,也不能作为子类的赋值操作符。
15:以下描述正确的是()。(2011 •盛大游戏)
虚函数是可以内联的,可以减少函数调用的开销提高效率
A.
类里面可以同时存在函数名和参数都一样的虚函数和静态函数
B.
父类的析构函数是非虚的,但是子类的析构函数是虚的,delete 子类对
C.
象指针会调用父类的析构函数
D •以上都不对
解答:C。C 中 delete 子类对象指针会调用父类的析构函数(即使子类的析
构 函数不是虚的,对子类对象指针调用析构函数,也会调用父类的析构函数),
但若 delete 父类对象指针却不会调用子类的析构函数(因为父类的析构函数
不是虚函数,不执行动态绑定)。
16:以下代码的输出结果是()。(2012 •小米)
class B{
.5 •
剩余20页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/dfba069df9d743e89798b70d3e80af24_xxpr_ybgg.jpg!1)
xxpr_ybgg
- 粉丝: 6564
- 资源: 3万+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)