当前位置: 首页 > news >正文

多态部分参考答案

一、选择题
1、下列关于动态联编的描述中,错误的是()。
A.动态联编是以虚函数为基础
B.动态联编是运行时确定所调用的函数代码的
C.动态联编调用函数操作是指向对象的指针或对象引用
D.动态联编是在编译时确定操作函数的
答案:D

2、设置虚基类的目的是( B )
A.简化程序 B.消除二义性 C.提高程序运行效率 D.减少目标代码

3、在派生类中重新定义虚函数时必须在(ABE)方面与基类保持一致。(多选题)
A.参数个数 B.参数类型 C.参数名字 D.操作内容 E.返回类型

4、多继承派生类构造函数构造对象时,()被最先调用。
A.派生类自己的构造函数 B.虚基类的构造函数
C.非虚基类的构造函数   D.派生类中子对象类的构造函数
答案:B
分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,
派生类中子对象类的构造函数, 派生类自己的构造函数。

5、C++类体系中,能被派生类继承的是()。
A.构造函数 B.虚函数 C.析构函数 D.友元函数
答案:B
分析:C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的.

6、关于虚函数的描述中,正确的是()。
A.虚函数是一个静态成员函数
B.虚函数是一个非成员函数
C.虚函数即可以在函数说明定义,也可以在函数实现时定义
D.派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型
答案:D

7、下面4个选项中,( )是用来声明虚函数的。
A.virtual B.public C.using D.false
答案:A

8、编译时的多态性可以通过使用( )获得。
A.虚函数和指针
B.重载函数和析构函数
C.虚函数和对象
D.虚函数和引用
答案:C,编译时多态就是静态多态,静态多态有函数重载、运算符重载、模板。A与D都可以实现动态多态。
使用对象调用虚函数,是静态联编,也就是静态多态(上课虚函数访问讲过)

9、关于纯虚函数和抽象类的描述中,错误的是( )。
A.纯虚函数是一种特殊的虚函数,它没有具体的实现
B.抽象类是指具有纯虚函数的类
C.一个基类中说明有纯虚函数,该基类派生类一定不再是抽象类
D.抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出
答案:C

10、下列描述中,( )是抽象类的特征。
A.可以说明虚函数
B.可以进行构造函数重载
C.可以定义友元函数
D.不能说明其对象
答案:D

11、以下( )成员函数表示虚函数。
A.virtual int vf(int);
B.void vf(int)=0;
C.virtual void vf()=0;
D.virtual void vf(int) { };
答案:C

12、如果一个类至少有一个纯虚函数,那么就称该类为(A)。
A.抽象类 B.虚函数 C.派生类 D.以上都不对
答案:A

13、要实现动态联编,必须通过( )调用虚函数。
A.对象指针 B.成员名限定 C.对象名 D.派生类名
答案:A

14、下面描述中,正确的是(A)。
A.virtual可以用来声明虚函数
B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类
C.即使基类的构造函数没有参数,派生类也必须建立构造函数
D.静态数据成员可以通过成员初始化列表来初始化
答案:A

二、写出下列程序的输出结果。
1、分析下列程序的输出结果。

#include <iostream>using std::endl;
using std::cout;class A
{
public:A() { cout << "A's cons." << endl; }virtual ~A() { cout << "A's des." << endl; }virtual void f() { cout<<"A's f()."<<endl; }void g() { f();}
};
class B 
: public A
{
public:B() { f(); cout<<"B's cons."<<endl; }~B() { cout<<"B's des."<<endl; }
};
class C 
: public B
{
public:C() { cout<<"C's cons."<<endl; }~C() { cout<<"C's des."<<endl; }void f() { cout<<"C's f()."<<endl; }
};
int  main(void)
{  A *a=new C;a->g();delete a;return 0;
}

运行结果:
A’s cons.
A’s f().
B’s cons.
C’s cons.
C’s f().
C’s des.
B’s des.
A’s des.

2、根据给定的程序执行结果,将下列程序补充完整。

#include <iostream>using std::endl;
using std::cout;class Base
{
public:Base(int i) {b = i;}(1)   
protected:int b;
};
class Derive1
:public Base
{
public:(2)   void Print(){cout<<"Derive1's Print() called."<<endl;}
};
class Derive2
:public Base
{   (3)   
};
void fun(  (4)  )
{      obj->Print();
}
int main(void)
{ (5)   fun(d1);fun(d2);
}
程序的执行结果如下:
Derive1's Print() called.
Derive2's Print() called.#include <iostream>using std::endl;
using std::cout;
class Base
{
public:Base(int i){b=i;}virtual void Print(){};
protected:int b;
};
class Derive1
:public Base
{
public:Derive1():Base(1){}void Print(){cout<<"Derive1's Print() called."<<endl;}
};
class Derive2
:public Base
{
public:Derive2():Base(1){}void Print(){cout<<"Derive2's Print() called."<<endl;}
};
void fun(Base *obj)
{obj->Print();
}int main(void)
{Base *d1=new Derive1;Base *d2=new Derive2;fun(d1);fun(d2);return 0;
}

3、根据给定的程序执行结果

#include <iostream>
using std::endl;
using std::cout;class A
{
public:A(int i,int j) {a=i;b=j;}void move(int i,int j) {a+=i;b+=j;}void disp() { cout << "(" << a << "," << b << ")" << endl;}
private:int a,b;
};class B:public A
{
public:B(int i,int j,int k,int l):A(i,j),x(k),y(l){ }void disp() {cout << x << "," << y << endl;}void fun() {move(3,5);}
private:int x,y;
};void main()
{A m(1,2);m.disp();B d(3,4,5,6);d.fun();d.A::disp();d.disp();
}

结果:
(1,2)
(6,9)
5,6

4、根据给定的程序执行结果

#include <iostream> 
using std::endl;
using std::cout;class Base {
public:Base(){   a=5;cout<<"Base a="<<a<<endl;}  
protected:int a;
};class  Base1:virtual public Base{
public:Base1(){	a=a+10; cout<<"Base1 a="<<a<<endl;} 
};class Base2: virtual public Base{
public:Base2(){a=a+20; cout<<"Base2 a="<<a<<endl;} 
};class Derived
:public Base1
,public Base2
{
public:Derived(){ cout<<"Derived a="<<a<<endl;} 
};int main(void)
{ Derived  obj;return  0; 
}

运行结果:
Base a=5
Base1 a=15
Base2 a=35
Derived a=35

5、根据给定的程序执行结果

#include<iostream>using std::endl;
using std::cout;class Base1{
public:virtual void fun()       {   cout<<"--Base1--\n";  }
};class Base2{
public:void fun()               	{   cout<<"--Base2--\n"; }
};class Derived
:public Base1
,public Base2
{
public:void fun(){   cout<<"--Derived--\n";  }
};int main()
{Base1 obj1,*ptr1;   Base2 obj2,*ptr2;   	Derived obj3;       	ptr1=&obj1;         	ptr1->fun();        	ptr2=&obj2;         	ptr2->fun();        	ptr1=&obj3;         	ptr1->fun();        	ptr2=&obj3;         	ptr2->fun(); return 0;	}

运行结果:
–Base1–
–Base2–
–Derived–
–Base2–

6、写出下列程序的结果:

class A
{
public:void FuncA(){printf( "FuncA called\n" );}virtual void FuncB(){printf( "FuncB called\n" );}
};
class B : public A
{
public:void FuncA(){A::FuncA();printf( "FuncAB called\n" );}virtual void FuncB(){printf( "FuncBB called\n" );}
};
void main( void )
{B	b;A	*pa;pa = &b;A *pa2 = new A;pa->FuncA();3) pa->FuncB();4)pa2->FuncA();5)pa2->FuncB();delete pa2;
}

key:FuncA called
FuncBB called
FuncA called
FuncB called

解析:
B b;
A *pa;
pa = &b;
A *pa2 = newA;
pa->FuncA(); ( 3)//pa=&b动态绑定但是FuncA不是虚函数,所以FuncA called
pa->FuncB(); ( 4)//FuncB是虚函数所以调用B中FuncB,FuncBB called
pa2->FuncA(); ( 5)//pa2是A类指针,不涉及虚函数,调用的都是A中函数,所以FuncA called FuncB called
pa2->FuncB()

7、写出下列程序的结果:

class Base {public:Base(int j): i(j)  {}virtual~Base() {}void func1() {i *= 10;func2();}int getValue() {return  i;}protected:virtual void func2() {i++;}protected:int i;
};
class Child: public Base {public:Child(int j): Base(j) {}void func1() {i *= 100;func2();}protected:void func2() {i += 2;}
};
int main() 
{Base * pb = new Child(1);pb->func1();cout << pb->getValue() << endl; delete pb; 
} 

key:12
Base * pb = new Child(1), 首先创建子类对象,初始化为1;
func1()不是虚函数,所以pb->func1()执行的是基类的func1函数,i= 10,然后调用func2()函数;
这里的func2是虚函数,要往下派生类寻找,找到后执行派生类中的func2(),此时,i = 12;
最后执行pb->getValue(),结果为12

三、简答题

  1. 什么是多态?虚函数的实现原理是什么?
    主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;

  2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

  3. 不能设置为虚函数的函数有哪些?构造函数能设置为虚函数吗?为什么?
    不能设置为虚函数的函数有:
    (1)普通函数(非成员函数)
    (2)友元函数
    (3)构造函数
    (4)静态成员函数
    (5)内联函数
    构造函数不能被设置为虚函数:
    (1)构造函数发生的时机在编译阶段,虚函数发生的时机在运行阶段
    (2)构造函数不能被继承,虚函数可以被继承
    (3)如果将构造函数设置为虚函数,那么就需要通过虚表找到虚函数的入口地址,那么就需要虚函数指针指向虚表,而虚函数指针存在对象布局的最前面,而如果构造函数不调用,那么对象就不一定是完整的,那么对象的存储布局的前面就不一定有虚函数指针,那如果没有虚函数指针就不能指向虚表。

  4. 在什么情况下析构函数要设置成虚函数?为什么?
    为了解决内存泄漏的问题,所以需要将析构函数设置为虚函数。

  5. 什么是纯虚函数?什么是抽象类?抽象类的作用是什么?
    答:抽象类是含有纯虚函数的类,其作用是作为多个表象不同,但本质相同类的抽象。
    故抽象类仅可以作为基类被继承,不可以实例化生成对象,不能初始化,不能被当做返回值,不能当做参数,但可以做指针类型和引用

  6. 什么是重载?什么是隐藏?什么是覆盖?他们之前的区别是?
    答:成员函数被重载特征是:

(1)相同的范围(在同一个类中);
(2)函数名字相同
(3)参数不同
(4)virtual 关键字可有可无

覆盖就是指派生类函数覆盖基类virtual函数,特征是:
(1)不同的范围(分别位于派生类与基类)
(2)函数名字相同
(3)参数相同
(4)基类函数必须有virtual 关键字

“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,派生对象都是调用派生类的同名函数。规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同,此时不论有无virtual关键字、基类的函数将被隐藏;
(2)如果派生类的函数与基类的函数同名,并且参数也相同、但是基类函数没有virtual 关键字,此时基类的函数被隐藏(注意别与覆盖混淆);
总结:
①同一类中的同名函数是重载;
②不同类中同名函数可能是覆盖,也可能是隐藏。根据是否有virtual以及函数参数是否相同区分;

相关文章:

多态部分参考答案

一、选择题 1、下列关于动态联编的描述中&#xff0c;错误的是&#xff08;&#xff09;。 A&#xff0e;动态联编是以虚函数为基础 B&#xff0e;动态联编是运行时确定所调用的函数代码的 C&#xff0e;动态联编调用函数操作是指向对象的指针或对象引用 D&#xff0e;动态联编…...

【高项】项目人力资源管理,沟通管理与干系人管理(十大管理)

【高项】项目人力资源管理&#xff0c;沟通管理与干系人管理&#xff08;十大管理&#xff09; 文章目录1、人力资源管理1.1 什么是人力资源管理&#xff1f;1.2 如何进行人力资源管理&#xff1f;&#xff08;过程&#xff09;1.3 人力资源管理工具1.4 人力资源管理文件2、沟通…...

Wikijs简介-强大可扩展的开源维基软件

Wikijs - 最强大 最可扩展的开源维基软件 使用 wiki.js 美丽直观的界面&#xff0c;让文档成为写作的乐趣&#xff01; 优点 &#x1f527; 随时随地安装 几乎适用于任何平台&#xff0c;并与PostgreSQL、MySQL、MariaDB、MS SQL Server 或 SQLite 兼容&#xff01; ⚙️ 管…...

微博舆情分析系统的设计与实现(python)

背景分析 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络的发达,微博舆情分析系统的资讯信息通过网络进行信息管理掀起了热潮,所…...

【AUTOSAR】【Lin通信】LinTrcv

目录 一、概述 二、功能说明 2.1 LIN收发器驱动程序操作模式 2.2 LIN收发器硬件操作模式 2.3 LIN收发器唤醒类型 2.4 LIN收发器唤醒模式 2.5 错误分类 2.5.1 开发错误 三、API接口 3.1 API定义 一、概述 该规范规定了模块LIN收发器驱动程序的功能、API和配置。它负责…...

UE4C++学习篇(十九)-- 动画蒙太奇初级使用

用一个第三人称的射击案例来简单介绍一下动画蒙太奇的使用&#xff0c;动画蒙太奇的具体介绍这里就不多说了&#xff0c;不知道的小伙伴可以去搜一下了解。 这里介绍角色射击&#xff0c;射击的时候播放一个射击动画。 选中需要创建出动画蒙太奇的动画&#xff0c;点击创建&am…...

子集和问题

目录 子集和问题 程序设计 程序分析 子集和问题 【问题描述】子集和问题的一个实例为〈S,c〉。其中,S={ x1 , x2 ,…,xn }是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得: 试设计一个解子集和问题的回溯法。 对于给定的正整数的集…...

苹果蓝牙耳机太贵了买哪个替代?苹果蓝牙耳机平替推荐

随着人们生活水平的提高&#xff0c;蓝牙耳机已经遍布在我们生活的各个角落。同时随着科技的发展&#xff0c;许多人果粉选择苹果耳机平替。下面我们一起来看看2023年有哪些适用于苹果的平替蓝牙耳机吧&#xff01; 一、南卡小音舱Lite2蓝牙耳机 蓝牙版本&#xff1a;5.3 售…...

CK-UR05-US桌面式超高频RFID发卡器开发手册之USB控制命令格式

CK-UR05-US桌面式超高频RFID发卡器支持USB控制命令格式&#xff0c;本文重点就此格式展开说明&#xff01; CK-UR05-US桌面式超高频RFID发卡器1、取版本号(GetReaderVersion) 功能:取读写器的硬件、软件版本 命令码: 02H 命令参数:无 命令包: 『40H 02H 02H BCH』 举例: 如…...

【华为OD机试】1025 - 字符串加解密

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1二、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x…...

阿里云版GPT官宣,我们问了它10个问题

4月7日&#xff0c;阿里云宣布自研大模型“通义千问”&#xff0c;目前已开始邀请用户测试体验。 阿里达摩院在NLP自然语言处理等前沿科研领域早已布局多年&#xff0c;并于2019年启动大模型研发&#xff0c;通义千问便是其最新成果&#xff0c;相当于阿里云版的“ChatGPT”。 …...

ORM框架之NHibernate

什么是NHibernate NHibernate是一个开源的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;它允许开发人员使用面向对象的方式来访问关系型数据库。它是Hibernate框架的C#版本&#xff0c;Hibernate框架是Java平台上的ORM框架。 使用NHibernate&#xff0c;您可以将…...

凑微分练习

前言 在学习第一类换元法&#xff08;凑微分法&#xff09;时&#xff0c;我们常常需要凑微分。为了更加熟练地运用凑微分法&#xff0c;下面有几道凑微分例题供大家练习。 记住df(x)f′(x)dxdf(x)f(x)dxdf(x)f′(x)dx 例题1 dx‾d(ax)dx\underline{\quad}d(ax)dx​d(ax)dx‾…...

JavaWeb——多线程使用哈希表

目录 一、HashMap 1、定义 二、HashTable 1、定义&#xff1a; 2、区别&#xff1a; 三、ConcurrentHashMap 1、定义&#xff1a; 2、优化 &#xff08;1&#xff09;、加锁粒度不同——触发锁冲突的频率不同 &#xff08;2&#xff09;、充分利用CAS机制——无锁编程…...

anaconda permission denied

可能是路径不对 我的是只写了dir&#xff0c;没写文件名&#xff0c;而我要的是某个文件的路径&#xff0c;所以就报这个错。 具体&#xff0c;我需要某个权重的路径&#xff0c;比如pytorch_resnet50.pth&#xff0c;但我只写了这个权重所在的dir&#xff0c;比如F:/software/…...

蓝桥杯带刷,带刷!!!

A:::::::::::::::::::::::::::::::::::m计划&#xff08;双指针&#xff0c;滑动窗口&#xff0c;倍增&#xff09; 题目描述 小明是个鹅卵石收藏者&#xff0c;从小到大他一共收藏了 nn 块鹅卵石&#xff0c;编号分别为 1∼n&#xff0c;价值分别为 a1​&#xff0c;a2​&…...

第03讲:MinIO分布式文件服务器

一、什么是MinIO Minio 是个基于 Golang 编写的开源对象存储套件&#xff0c;虽然轻量&#xff0c;却拥有着不错的性能。 官网地址&#xff1a;MinIO | High Performance, Kubernetes Native Object Storageopen in new window官网文档地址&#xff1a;MinIO | The MinIO Qui…...

WireShark

wireshark 常用命令&#xff1a; frame.len 帧数据总长度&#xff1a;包含MAC头IP头UDP头UDP数据 eg: 1、 重传命令的长度是62, Frame.len 62 2、 长度大于200的包&#xff0c;frame.len > 200 3、 长度小于80的包&#xff0c;frame.len < 80 Ip.src 数据包的发送源IP地…...

Thinkphp 6.0多语言

本节课我们来学习一下如何配置的多语言功能&#xff0c;并实现调用方法。 一&#xff0e;多语言 1. 如果要开启多语言切换功能&#xff0c;中间件定义文件 middleware.php 开启&#xff1b; // 多语言加载 \think\middleware\LoadLangPack::class, 2. 配置文件在 config/lang…...

生成式AI已形成全球性“AI再造业务”趋势

3月28日至31日&#xff0c;博鳌亚洲论坛2023年年会在海南举行。实体经济与数字经济如何融合发展&#xff0c;产业数字化如何加速向深层次拓展&#xff0c;生成式AI会给产业经济带来哪些变革&#xff1f;这些话题成为今年论坛热点。 百度集团执行副总裁、百度智能云事业群总裁沈…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...