个人主页:Lei宝啊
愿所有美好如期而遇
选择题
以下程序输出结果是什么()
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 E: 编译出错 F: 以上都不正确
解析:
首先我们要明白类B继承类A,只是继承了使用权,并不是拷贝一份,所以从类A继承下来的还是属于类A。
new一个B的对象返回其地址给p,p调用test函数,首先在类B中寻找test函数,找不到,去父类中找test函数,test函数隐藏的参数是A*this指针,我们使用B*p去调用,传过去的相当于A* this = p;然后this->func(),这里是多态调用,所以func调用的是类B的func函数(这个函数是虚函数,同时也进行了重写,是构成多态的),同时虚函数的继承是一种接口继承,继承的是接口,也就是说,这里调用类B的func函数,接口是类A的,实现是类B的,所以我们的最终答案是B。
编程题
连续最大和https://www.nowcoder.com/practice/5a304c109a544aef9b583dce23f5f5db?tpId=182&tqId=34613&ru=/exam/oj
思路:
值连续相加,如果前面所有连续的值相加小于后面即将要加的值,那么舍弃前面的所有值,从后面即将考加的值开始,再继续遍历。
比如:
-1 + 2 < 2,则我们从2开始再向后加,前面的值舍弃。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> v(n);
for(auto &e : v) cin >> e;
int sum = v[0];
int max_num = v[0];
for(int i=1; i<n; i++)
{
sum = max(sum + v[i], v[i]);
if(sum > max_num)
max_num = sum;
}
cout << max_num;
return 0;
}
// 64 位输出请用 printf("%lld")