【C++】刷题日记(day1)

220 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

一、选择题。

1、下面有关虚函数和非虚函数的区别说法错误的是?

A、子类的指针访问非虚函数访问的是子类的方法

B、父类的指针访问虚函数访问的是父类的方法

C、父类的指针访问非虚函数访问的是父类的方法

D、子类的指针访问虚函数访问的是子类的方法

答案B。分析: 父类的指针访问虚函数访问可能是父类的方法,也可能是子类的方法,因为 父类的指针访问虚函数是运行时确定的。

2、下面关于多态性的描述,错误的是()

A、编译时的多态性可通过函数重载实现

B、运行时的多态性可通过模板和虚函数实现

C、实现运行时多态性的机制称为动态绑定

D、C++语言的多态性分为编译时的多态性和运行时的多态性

答案B。多态分为编译时多态和运行时多态,编译时多态是依靠模板和继承实现的,而运行时多态是靠虚函数确定的。

3、当一个类的某个函数被说明为virtual,则在该类的所有派生类中的同原型函数

A.只有被重新说明时才识虚函数

B.只有被重新说明为virtual时才是虚函数

C.都不是虚函数

D.都是虚函数

答案D。分析:(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。         (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual    关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)该题就是第二种情况,所以选D。

4、以下关于C++的描述中哪一个是正确的()

子类指针不可以指向父类实例

任何引用都必须指向一个实例

引用所指向的实例不可能无效

任何指针都必须指向一个实例

答案:B。分析: 任何引用都必须指向一个实例,但是指针可以不用指向实例。

5、调用一成员函数时,使用动态联编的情况是()

A、通过对象调用静态函数

B、通过指针或引用调用一虚函数通过指针或引用调用一虚函数

C、通过对象调用一虚函数

D、通过指针或者引用调用一静态函数

答案:B。分析:动态联编的概念:

动态联编就是程序在运行的时候知道该调用哪个函数,而不是编译阶段,所以这个机制应该是由虚函数支持的,即运行时的多态,基类的某个成员函数声明为虚函数,派生类继承,而且同样重写该函数,那么当声明一个派生类的指针或者引用时,它所调用的函数是由该指针指向的对象确定的,这就是动态联编。由概念可知是选B。


二、编程题

1、完全数计算

image.png

分析题意:输入n以内的完全数,完全数就是除了自身外的真因子相加等于自身,所以用两层for循环,把符合的数输出来就可以了。

#include<iostream>
#include<string>
using namespace std;

int main()
{
int n;
int cnt = 0;
cin >> n;
for (int i = 1; i < n; i++)
{
int sum = 0;
for (int j = 1; j <= i; j++)
{
if (i % j == 0)
sum += j;
}
if (sum == 2 * i) cnt++;
}
cout << cnt << endl;
return 0;
}

2、扑克牌大小

image.png image.png

这题难度较大,大家根据代码来理解一下会更好。

#include <string>
#include <vector>
#include <iostream>
using namespace std;
#define PrintS1 {cout << s1 << endl;return 0;}
#define PrintS2 {cout << s2 << endl;return 0;}
int count(string& str) {
	int n = 0;
	string::size_type  i = 0, k = 0;
	while ((k = str.find(' ', i)) != string::npos) {
		n++; i = k + 1;
	}
	return n;
}
int main() {
	string input;
	getline(cin, input);
	string s1, s2;
	int t = input.find('-');
	s1 = input.substr(0, t);
	s2 = input.substr(t + 1);
	int n1 = count(s1);
	int n2 = count(s2);
	string POKER = "345678910JQKA2jokerJOKER";
	vector<string> MAX = { "joker JOKER", "JOKER joker" };
	if (s1 == MAX[0] || s1 == MAX[1]) PrintS1
		if (s2 == MAX[0] || s2 == MAX[1]) PrintS2
			if (n1 == n2) {
				string f1, f2;
				string::size_type k = s1.find(' ');
				f1 = s1.substr(0, k);
				k = s2.find(' ');
				f2 = s2.substr(0, k);
				if (POKER.find(f1) > POKER.find(f2))PrintS1
					PrintS2
			}
	if (n1 == 3 && n2 != 3) PrintS1
		if (n2 == 3 && n1 != 3) PrintS2
			cout << "ERROR" << endl;
}

总结

image.png

    本文总共讲了5题有关多态的选择题,以及两道牛客编程题,希望大家读后能够有所收获!