开启掘金成长之旅!这是我参与「掘金日新计划 · 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、完全数计算
分析题意:输入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、扑克牌大小
这题难度较大,大家根据代码来理解一下会更好。
#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;
}
总结
本文总共讲了5题有关多态的选择题,以及两道牛客编程题,希望大家读后能够有所收获!