备战秋招 | 笔试强训15

news2024/11/28 6:35:47

目录

一、选择题

二、编程题

三、选择题题解

四、编程题题解


一、选择题

1、在公有派生的情况下,派生类中定义的成员函数只能访问原基类的()

A. 公有成员和私有成员

B. 私有成员和保护成员

C. 公有成员和保护成员

D. 私有成员,保护成员和公有成员

2、有如下C++代码:输出答案为

struct A
{
    void foo(){printf("foo");}
    virtual void bar(){printf("bar");}
    A(){bar();}
};
struct B:A
{
    void foo(){printf("b_foo");}
    void bar(){printf("b_bar");}
};

int main()
{
    A *p = new B;
    p->foo();
    p->bar();
    return 0;
}

A. barfoob_bar

B. foobarb_bar

C. barfoob_foo

D. foobarb_fpp

3、关于抽象类和纯虚函数的描述中,错误的是

A. 纯虚函数的声明以“=0;”结束

B. 有纯虚函数的类叫抽象类,它不能用来定义对象

C. 抽象类的派生类如果不实现纯虚函数,它也是抽象类

D. 纯虚函数不能有函数体

4、以下程序输出结果是()

class A
{
public:
    virtual void func(int val = 1)
     { 
         std::cout<<"A->"<<val <<std::endl;}
    virtual void test()
    { 
        func();
    }
};
class B : public A
{
public:
    void func(int val=0) 
    {
        std::cout<<"B->"<<val <<std::endl;
    }
};
int main(int argc ,char* argv[])
{
    B*p = new B;
    p->test();
    return 0;
}

A. A->0

B. B->1

C. A->1

D. B->0

5、下面程序的输出是()

class A
{
public:
    void foo()
    {
        printf("1");
    }
    virtual void fun()
    {
        printf("2");
    }
};
class B: public A
{
public:
    void foo()
    {
        printf("3");
    }
    void fun()
    {
        printf("4");
    }
};
int main(void)
{
    A a;
    B b;
    A *p = &a;
    p->foo();
    p->fun();
    p = &b;
    p->foo();
    p->fun();
    A *ptr = (A *)&b;
    ptr->foo();
    ptr->fun();
    return 0;
}

A. 121434

B. 121414

C. 121232

D. 123434

6、如果类B继承类A,A::x()被声明为虚函数,B::x()重载了A::x()方法,在下述语句中哪个x()方法会被调用()

B b;
b.x();

A. A::x()

B. B::x()

C. A::x() B::x()

D. B::x() A::x()

7、下面关于虚函数的描述,错误的是

A. 在成员函数声明的前面加上virtual修饰,就可把该函数声明为虚函数

B. 基类中说明了虚函数后,派生类中对应的函数也必须说明为虚函数

C. 虚函数可以是另一个类的友元函数,但不能是静态成员函数

D. 基类中说明的纯虚函数在其任何需要实例化的派生类中都必须实现

8、下列为纯虚函数的正确声明的是()

A. void virtual print()=0;
B. virtual void print()=0;
C. virtual void print(){};
D. virtual void print()\;

9、下面这段代码运行时会出现什么问题?

class A
{
public:
    void f()
    {
        printf("A\n");
    }
};
class B: public A
{
public:
    virtual void f()
    {
        printf("B\n");
    }
};
int main()
{
    A *a = new B;
    a->f();
    delete a;
    return 0;
}

A. 没有问题,输出B

B. 不符合预期的输出A

C. 程序不正确

D. 以上答案都不正确

10、下面这段代码会打印出什么?

class A
{
public:
    A()
    {
        printf("A ");
    }
    ~A()
    {
        printf("deA ");
    }
};
class B
{
public:
    B()
    {
        printf("B ");
    }
    ~B()
    {
        printf("deB ");
    }    
};
class C: public A, public B
{
public:
    C()
    {
        printf("C ");
    }
    ~C()
    {
        printf("deC ");
    }
};
int main()
{
    A *a = new C();
    delete a;
    return 0;
}

A. A B C deA

B. C A B deA

C. A B C deC

D. C A B deC

二、编程题

1、查找输入整数二进制中1的个数  题目链接

 2、手套  题目链接

三、选择题题解

 

1、在公有派生的情况下,派生类中定义的成员函数只能访问原基类的()

A. 公有成员和私有成员

B. 私有成员和保护成员

C. 公有成员和保护成员

D. 私有成员,保护成员和公有成员

正确答案:C

题解:

         派生类中访问父类那一部分成员的权限取 继承方式原本基类中成员权限 的较小值,但是如果父类成员是private修饰时,对子类不可见;故选C

2、有如下C++代码:输出答案为

struct A
{
    void foo(){printf("foo");}
    virtual void bar(){printf("bar");}
    A(){bar();}
};
struct B:A
{
    void foo(){printf("b_foo");}
    void bar(){printf("b_bar");}
};

int main()
{
    A *p = new B;
    p->foo();
    p->bar();
    return 0;
}

A. barfoob_bar

B. foobarb_bar

C. barfoob_foo

D. foobarb_fpp

正确答案:A

题解:

         本题考察关于虚函数以及多态;首先我们要清楚的是我们的虚表是什么时候生成的;虚表又称虚函数表,在我们编译阶段生成的;而我们的虚表指针是在创建对象的时候生成的,也就是运行状态;而我们的子类在构建对象时,首先是调用父类的默认构造来构造初始化父类那一部分,然后在给我们的虚表指针赋值指向虚表;然后走初始化列表,最后走子类构造函数体;因此本题我们new一个子类时,首先调用父类构造,父类构造函数体中有调用虚函数,但是此时我们子类的虚函数表还没生成,故只能调用父类的虚函数bar,接着创建好的B对象的地址放进p中,下面两个调用就是多态了,foo父类并没有声明成虚函数,故调用父类的foo,接着bar父类定义成了虚函数,且子类对其进行了重写,故调用子类的bar,最后选A;

3、关于抽象类和纯虚函数的描述中,错误的是

A. 纯虚函数的声明以“=0;”结束

B. 有纯虚函数的类叫抽象类,它不能用来定义对象

C. 抽象类的派生类如果不实现纯虚函数,它也是抽象类

D. 纯虚函数不能有函数体

正确答案:D

题解:

         D选项描述错误,纯虚函数可以有函数体,只是没有意义;

4、以下程序输出结果是()

class A
{
public:
    virtual void func(int val = 1)
     { 
         std::cout<<"A->"<<val <<std::endl;}
    virtual void test()
    { 
        func();
    }
};
class B : public A
{
public:
    void func(int val=0) 
    {
        std::cout<<"B->"<<val <<std::endl;
    }
};
int main(int argc ,char* argv[])
{
    B*p = new B;
    p->test();
    return 0;
}

A. A->0

B. B->1

C. A->1

D. B->0

正确答案:B

题解:

         本题考察多态的重写相关细节;我们分析题目,func与test都在父类声明成了虚函数;而func在子类中进行了重写,test并没有完成重写;我们用子类的指针调用继承自父类的test函数,test函数有一个隐藏的参数,就是this指针,而这个this指针的类型其实是 A* const this,这种类型;此时我们在test函数里调用func,func前面其实省略了一个this,也就是父类指针调用func,且func为虚函数并在子类中完成了重写,而重写的一个特点是只对实现进行重写,因此我们仅仅只是把函数体替换,缺省值不变,故打印的是B选项;

5、下面程序的输出是()

class A
{
public:
    void foo()
    {
        printf("1");
    }
    virtual void fun()
    {
        printf("2");
    }
};
class B: public A
{
public:
    void foo()
    {
        printf("3");
    }
    void fun()
    {
        printf("4");
    }
};
int main(void)
{
    A a;
    B b;
    A *p = &a;
    p->foo();
    p->fun();
    p = &b;
    p->foo();
    p->fun();
    A *ptr = (A *)&b;
    ptr->foo();
    ptr->fun();
    return 0;
}

A. 121434

B. 121414

C. 121232

D. 123434

正确答案:B

题解:

         首先我们看p的类型,是A类的指针,我们拿a的地址赋值给p,然后分别调用没有完成重写的foo和完成重写的fun,则分别打印1和2,然后我们将b的地址赋值给p,此时是用子类指针调用,完成多态调教,然后分别调用则打印1和4,最后只是进行了强制类型的转换,也是打印1和4,故选B;

6、如果类B继承类A,A::x()被声明为虚函数,B::x()重载了A::x()方法,在下述语句中哪个x()方法会被调用()

B b;
b.x();

A. A::x()

B. B::x()

C. A::x() B::x()

D. B::x() A::x()

正确答案:B

题解:

         多态有两个必不可少的条件,1是虚函数的重写,题目已经提供,2是父类的指针或引用来调用,并没有达成,故没有形成多态,还是调用B类的x函数;故选B;

7、下面关于虚函数的描述,错误的是

A. 在成员函数声明的前面加上virtual修饰,就可把该函数声明为虚函数

B. 基类中说明了虚函数后,派生类中对应的函数也必须说明为虚函数

C. 虚函数可以是另一个类的友元函数,但不能是静态成员函数

D. 基类中说明的纯虚函数在其任何需要实例化的派生类中都必须实现

正确答案:B

题解:

         B选项,派生类对应的函数可以添加virtual也可以不添加;没有强制要求;

8、下列为纯虚函数的正确声明的是()

A. void virtual print()=0;
B. virtual void print()=0;
C. virtual void print(){};
D. virtual void print()\;

正确答案:B

题解:

         语法规定,选B;

9、下面这段代码运行时会出现什么问题?

class A
{
public:
    void f()
    {
        printf("A\n");
    }
};
class B: public A
{
public:
    virtual void f()
    {
        printf("B\n");
    }
};
int main()
{
    A *a = new B;
    a->f();
    delete a;
    return 0;
}

A. 没有问题,输出B

B. 不符合预期的输出A

C. 程序不正确

D. 以上答案都不正确

正确答案:B

题解:

         因为我们的父类中并没有将 f 声明成虚函数,因此没有成功完成虚函数的重写,而我们用父类的指针调用时,还是调用的父类的 f 函数,故选B;

10、下面这段代码会打印出什么?

class A
{
public:
    A()
    {
        printf("A ");
    }
    ~A()
    {
        printf("deA ");
    }
};
class B
{
public:
    B()
    {
        printf("B ");
    }
    ~B()
    {
        printf("deB ");
    }    
};
class C: public A, public B
{
public:
    C()
    {
        printf("C ");
    }
    ~C()
    {
        printf("deC ");
    }
};
int main()
{
    A *a = new C();
    delete a;
    return 0;
}

A. A B C deA

B. C A B deA

C. A B C deC

D. C A B deC

正确答案:A

题解:

        我们在构造子类的时候,会首先构造其父类那一部分,而构造父类的顺序只跟继承的顺序有关,跟初始化列表中分布的顺序无关,因此我们会依次打印 A B C;然后我们调用delete,析构A类型的指针a,故调用A类的析构函数,打印deA;

四、编程题题解

1、查找输入整数二进制中1的个数

思路:我们可以巧妙的利用位运算进行统计,我们通过 num &= num - 1来去掉num二进制中的最后一个1,循环往复,知道全部去完;

#include <iostream>
using namespace std;

int main() 
{
    int num;
    while(cin >> num)
    {
        // 统计二进制1的个数
        int count = 0;
        while(num)
        {
            num &= num - 1;
            count++;
        }
        cout << count << endl;
    }
}

2、手套

思路:我们是否可以将左手或者右手的每一种都确保肯定有一只,那么另一边取再拿一只不就可以做到保证整体肯定能凑成一对了么,如下所示;

        我们取其中左手或右手中覆盖每一种可能的手套数中的较小的那一个,然后+1(从另一边随意取一只都可以匹配成一对) ,仔细想是不是这么一个道理,但是到这并不能把题完全解出来,我们还没有考虑某一边的某种颜色为0的情况;如下所示;

        根据如上,我们可以写出如下代码;

class Gloves {
public:
    int findMinimum(int n, vector<int> left, vector<int> right) 
    {
        int left_sum = 0, left_min = INT_MAX;
        int right_sum = 0, right_min = INT_MAX;
        int sum = 0;
        for(int i = 0; i < n; i++)
        {
            if(left[i] == 0 || right[i] == 0)
                sum += left[i] + right[i];
            else
            {
                left_sum += left[i];
                left_min = min(left_min, left[i]);
                right_sum += right[i];
                right_min = min(right_min, right[i]);
            }
        }
        sum += min(left_sum - left_min + 1, right_sum - right_min + 1) + 1;
        return sum;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Docker-compose创建LNMP环境并运行Wordpress网站平台

基于Docker-compose创建LNMP环境并运行Wordpress网站平台 1.Docker-Compose概述2.YAML文件格式及编写注意事项3.Docker-Compose配置常用字段4.Docker Compose常用命令5.使用Docker-compose创建LNMP环境&#xff0c;并运行Wordpress网站平台1. Docker Compose 环境安装下载安装查…

Spring 的元注解

一、元注解介绍 1.1.源码引入 1.2.元注解介绍 从上面的图片可知&#xff0c;Spring 有四个【负责注解其他注解】的元注解&#xff0c;分别是&#xff1a; Target&#xff1a;标识该注解可以用于标注哪些程序元素&#xff0c;比如类、方法、字段等。 Retention&#xff1a;标…

【PS教程-环境搭建】

下载地址 安装教程 软件安装包下载解压打开。找到Set-up应用程序双击运行安装。点击继续&#xff0c;或者你需要更改安装位置。软件正在安装中。软件安装成功。安装完成&#xff0c;打开软件使用。 通道抠图&#xff08;主体颜色不能和背景相近&#xff09; 抠图攻略 首先…

重学C++系列之const与static关键字分析

前言 本篇幅讲解关键字const与static&#xff0c;主要围绕在类的范围内叙述&#xff0c;包括作用和使用场景等。 一、const与static的作用 1、const修饰的成员变量&#xff0c;成员变量初始化后不能再修改。 2、const修饰的成员函数&#xff0c;成员函数不可以修改成员变量&am…

063、故障处理之快速恢复数据

数据丢失快速恢复的重要性 目的&#xff1a;尽快修复数据&#xff0c;恢复业务 快速恢复相关技术对比 常用备份恢复技术 数据快速恢复原理 MVCC 是TiDB数据库原生的一项功能&#xff0c;默认使用无需配置&#xff0c;它使用多个历史快照的方式来维护数据在某个时间点对并…

五步快速搭建个性化外卖小程序商城

随着人们生活节奏的加快&#xff0c;外卖行业蓬勃发展。为了满足用户的需求&#xff0c;许多企业开始使用小程序商城来提供外卖服务。那么&#xff0c;如何制作一个功能完善、用户友好的外卖小程序商城呢&#xff1f;下面就来为大家详细介绍一下制作的步骤。 首先&#xff0c;我…

【深度学习】以图搜索- facebook的faiss 从环境搭建到运行案例从0到1

文章目录 前言安装小试牛刀项目延伸总结 前言 Faiss的全称是Facebook AI Similarity Search。 这是一个开源库&#xff0c;针对高维空间中的海量数据&#xff0c;提供了高效且可靠的检索方法。 暴力检索耗时巨大&#xff0c;对于一个要求实时人脸识别的应用来说是不可取的。 …

当深度强化学习(DRL)遇见图神经网络(GNN)

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在学习摘录和笔记专…

day02.数组

一,数组 数组:一组有序的相同类型数据的集合 1.1声明数组: 数组元素类型 数组名【】;数组元素类型【】 数组名; 🎃more : 数组元素类型【】【】数组名;注:Java的数组是先声明对象再分配空间(而C语言是声明数组的同时指明了数组的长度,给数组分配了…

fastadmin采坑之接口分页处理

其实不算fastadmin的代码而是thinkphp自带的分页代码 paginate函数就是自带的分页函数&#xff0c;开始我以为这个只能用于渲染模板不能用于接口&#xff0c;后面看到源代码发现请求参数带page就可以 /*** ApiTitle (获取协会会员)* ApiSummary (获取协会会员)* ApiMethod …

买卖股票的最佳时机系列

//方法一 class Solution { public:int dp[100005];int maxProfit(vector<int>& prices) {//dp[i]表示前i天买入卖出的获取的最大利润//min_val表示前i-1天买入的最小值&#xff1b;dp[0]0;int min_valprices[0];for(int i1;i<prices.size();i){dp[i]max(dp[i-1],…

7.26 作业

1. 完善登录界面 main.c #include "widget.h" #include "second.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();Second s;QObject::connect(&w,&Widget::to_second,&s,…

利用mysqldump实现分库分表备份的shell脚本

一、信息摘要 linux版本&#xff1a;CentOS 7.9 mysql版本&#xff1a;MySQL 5.7.36 脚本实现功能&#xff1a;利用mysqldump工具实现对mysql中的数据库分库备份&#xff0c;和对所备份数据库中的表分表备份 二、shell脚本 #!/bin/bash ######################### #File n…

ROS1ROS2之CmakeList.txt和package.xml用法详解

前言&#xff1a;目前还在学习ROS无人机框架中&#xff0c;&#xff0c;&#xff0c; 更多更新文章详见我的个人博客主页【前往】 文章目录 1. CMakeLists.txt与package.xml的作用2. 生成CMakeLists.txt2.1 ROS12.2 ROS2 3. CMakeLists.txt编写3.1 ROS13.2 ROS2 4. package.xml…

【Linux指令集】---tar指令(超详细)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

常见面试题之设计模式--策略模式

1. 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进行开发&a…

(学习日记)2023.04.30

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

JS基础算法03--俩数之和

最简单 &#xff0c; 最基础的。 如果不会 &#xff0c; 请写会 &#xff0c;请掌握&#xff0c;请让心安定 给定一个数组 nums 和一个目标值 target&#xff0c;在该数组中找出和为目标值的两个数 const nums [1, 2, 3, 4, 5, 6, 7, 8]const target 5function find(nums, t…

Vue.js入门指南:从基础到进阶,掌握现代JavaScript框架的核心概念与高级特性(2W字小白教程)

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

基于 Python 的性能测试工具 locust (与 LR 的简单对比)

目录 前言&#xff1a; 背景 基础 测试需求 服务器端 LR 中的测试脚本 locust 中的测试脚本 LR 中的测试过程和结果 Locust 中的测试过程和结果 结果比较 总结 前言&#xff1a; Locust 是一种开源的性能测试工具&#xff0c;可以帮助我们快速地进行网站、应用程序…