(C++练习)选择题+编程题
个人主页: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")